Usando MSBuild.exe para "Publicar" un proyecto ASP.NET MVC 4 con la línea cmd

82

Estoy buscando un comando para ejecutarlo MSBuild.exeque solo toma un proyecto MVC 4 y lo publica en un directorio determinado.

Por ejemplo,

MSBuild <solution>/<project>.csproj -publish -output=c:/folder

Obviamente, esta es una sintaxis incorrecta. Intento simplificar mi pregunta.

Esta pregunta habla de un XML de compilación, pero no estoy tratando de hacer nada con tantos detalles.

Simplemente estoy tratando de hacer una implementación.

Más abajo en esa pregunta , alguien habla de "MSDeploy". Puedo investigar eso, pero ¿es la única opción? No tengo la capacidad de instalar la implementación web en el servidor. En cuyo caso, todo lo que realmente necesito hacer es "Publicar" y enviar el contenido del proyecto publicado a un directorio determinado en el servidor / sistema de archivos.

¿Alguien tiene un forro que pueda usar?

¿Tengo que usar MSDeploy?

¿MSDeploy requiere que la implementación web esté instalada en el servidor?

¿No es necesario configurar la implementación web en el servidor para configurar algunos puertos, permisos e instalar algunos complementos de IIS?

Me encantaría ejecutar algo simple.

Erik5388
fuente

Respuestas:

152

En VS 2012 (así como las actualizaciones de publicación disponibles en el SDK de Azure para VS 2010), hemos simplificado la publicación de línea de comandos para proyectos web. Lo hemos hecho utilizando Publicar perfiles.

En VS para un proyecto web, puede crear un perfil de publicación usando el diálogo de publicación. Cuando crea ese perfil, se almacena automáticamente en su proyecto en Propiedades \ PublishProfiles. Puede usar el perfil creado para publicar desde la línea de comando con una línea de comando lo siguiente.

msbuild mysln.sln /p:DeployOnBuild=true /p:PublishProfile=<profile-name>

Si desea almacenar el perfil de publicación (archivo .pubxml) en alguna otra ubicación, puede pasar la ruta al PublishProfile.

Los perfiles de publicación son archivos de MSBuild. Si necesita personalizar el proceso de publicación, puede hacerlo directamente dentro del archivo .pubxml.

Si su objetivo final es pasar propiedades desde la línea de comando. Recomendaría lo siguiente. Cree un perfil de publicación de muestra en VS. Inspeccione ese perfil de publicación para determinar qué propiedades de MSBuild necesita pasar en la línea de comandos. Para su información, no todos los métodos de publicación admiten la publicación de línea de comandos (es decir, FTP / FPSE).

Para su información, si está compilando .csproj / .vbproj en lugar de .sln y está utilizando VS 2012, también debe pasar /p:VisualStudioVersion=11.0. Para obtener más detalles sobre el motivo, consulte http://sedodream.com/2012/08/19/VisualStudioProjectCompatabilityAndVisualStudioVersion.aspx .

Sayed Ibrahim Hashimi
fuente
3
Creo que el OP simplemente quiere "implementar" la aplicación web en una carpeta arbitraria en su máquina local.
Richard Szalay
3
entonces, en un servidor de implementación, una persona necesitaría instalar el IDE de Visual Studios para que un comando como ese funcione.
Erik5388
2
o podría simplemente hacer esto: microsoft.com/en-us/download/details.aspx?id=30670
Erik5388
10
¿Funciona esto en VS 2013? Ejecutando la misma línea de comando, no produce publicación. Tampoco hay errores. Prueba con una implementación de sistema de archivos simple en un perfil de publicación. obras de construcción, pero ningún resultado de publicación. El destino está vacío.
Rex Whitten
2
Cuando uso esto, publica mi compilación de depuración a pesar de que el archivo .pubxml tiene <LastUsedBuildConfiguration> Release </LastUsedBuildConfiguration>
reggaeguitar
11

Cree un archivo build.xml que se vea a continuación

Inicie el símbolo del sistema de Visual Studio

Ejecute msbuild build.xml

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="Build">

  <PropertyGroup>
    <Build>$(MSBuildProjectDirectory)\Build</Build>
    <ProjectFile>MyProject.csproj</ProjectFile> 
    <ProjectName>MyProjectNameInVisualStudio</ProjectName>
    <CopyTo>$(MSBuildProjectDirectory)\CopyTo</CopyTo>
  </PropertyGroup> 

  <Target Name="Build"> 
    <RemoveDir Directories="$(Build)"/>  
    <MSBuild Projects="$(ProjectFile)" Properties="Configuration=Release;OutputPath=$(Build);OutDir=$(Build)/"></MSBuild>  
    <Exec Command="robocopy.exe  $(Build)\_PublishedWebsites\$(ProjectName) $(CopyTo) /e /is
      if %errorlevel% leq 4 exit 0 else exit %errorlevel%"/>    
  </Target>

</Project>
nulos
fuente
7
Esta respuesta fue muy útil para mí, pero hay una cosa que agregaría para mejorarla. Si lo ejecuta como está escrito, robocopy devolverá el código de salida 1 para indicar una copia exitosa ... haciendo que msbuild piense que la compilación ha fallado. Para solucionar esto, simplemente agregue "if% errorlevel% leq 1 exit 0 else exit% errorlevel%" después de la / e en el comando robocopy.
Alex
Tanto la respuesta anterior como los comentarios de Alex me ayudaron. También agregaría <RemoveDir Directories = "$ (CopyTo)" /> antes </Target> para mantener limpia la carpeta del proyecto.
JackArbiter
6

El siguiente comando funciona perfectamente:

msbuild Myproject.sln  /t:Rebuild /p:outdir="c:\outproject\\" /p:Configuration=Release /p:Platform="Any CPU"
jamilir
fuente
3
cuando solo desea publicar los archivos de contenido, esto funciona. Pero las transformaciones web.config no se ejecutan
andreas
1
Este método no funciona para publicar un sitio web MVC (las vistas no se copian)
eka808
Para una aplicación web como Web API, no se generan dos archivos críticos en la carpeta bin: App_global.asax.dll y App_global.asax.compiled. Recomiendo usar el ejemplo de Sayed anterior.
Fred Peters
1

Encontré que la respuesta fue implementar la configuración predeterminada, es decir, depurar. MSBuild parece ignorar la configuración seleccionada en el perfil de publicación. En consecuencia, cambié el comando para especificar la configuración correcta para la implementación ...

msbuild mysln.sln /p:Configuration=[config-name] /p:DeployOnBuild=true /p:PublishProfile=[profile-name]

donde config-name = Release o alguna otra configuración de compilación que haya creado

Mick
fuente
0

Con los proyectos web, debe compilar, como se indicó anteriormente, pero luego también debe empaquetar / copiar. Usamos una copia de archivo, en lugar de "publicar" ...

También; utilizamos DEBUG / RELEASE para construir el sitio web; pero luego entornos reales, es decir, "QA" o "PROD" para manejar las transformaciones web.config.

Así que lo construimos inicialmente con RELEASE y luego lo empaquetamos con QA, en el siguiente ejemplo.

  <PropertyGroup>   
    <SolutionName>XXX.Website</SolutionName>
    <ProjectName>XXX.Website</ProjectName>
    <IisFolderName>XXX</IisFolderName>

    <SolutionConfiguration>QA</SolutionConfiguration> <!--Configuration will be set based on user selection-->   

    <SolutionDir>$(MSBuildThisFileDirectory)..</SolutionDir>
    <OutputLocation>$(SolutionDir)\bin\</OutputLocation>
     <WebServer>mywebserver.com</WebServer>
  </PropertyGroup>

  <Target Name="BuildPackage">
    <MSBuild Projects="$(SolutionDir)\$(SolutionName).sln" ContinueOnError="false" Targets="Clean;Rebuild" Properties="Configuration=Release" />
    <MSBuild Projects="$(SolutionDir)\$(ProjectName)\$(ProjectName).csproj" ContinueOnError="false" Targets="Package" Properties="Configuration=$(SolutionConfiguration);AutoParameterizationWebConfigConnectionStrings=False" />
  </Target>

  <Target Name="CopyOutput">
    <ItemGroup>
      <PackagedFiles Include="$(SolutionDir)\$(ProjectName)\obj\$(SolutionConfiguration)\Package\PackageTmp\**\*.*"/>
    </ItemGroup>
    <Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\$(WebServer)\$(IisFolderName)\$(SolutionConfiguration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
  </Target>

Entonces;

  1. Configura tus propiedades
  2. Llamar al destino BuildPackage
  3. Llame al objetivo de CopyOutput y ¡listo!
James Joyce
fuente