Uso de msbuild para ejecutar un Perfil de Publicación del Sistema de archivos


Tengo un proyecto c#. Net 4.0 creado con VS2010 y ahora se accede con VS2012.

Estoy tratando de publicar solo los archivos necesarios de este sitio web a una ubicación de destino (C:\builds\MyProject [Archivos])

Mi estructura de archivos: ./ ProjectRoot / MyProject.csproj ./ ProjectRoot/Properties/PublishProfiles / FileSystemDebug.pubxml

Estoy ejecutando lo siguiente a través de MSBuild:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ ProjectRoot / MyProject.csproj / p: DeployOnBuild = true /p: PublishProfile=./ ProjectRoot/Properties/PublishProfiles / FileSystemDebug.pubxml

Aquí está el xml en FileSystemDebug.pubxml

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\builds\MyProject\</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

El comportamiento resultante es:

  • se crea un archivo zip aquí:./ ProjectRoot/obj/Debug/Package / MyProject.zip
  • No se despliega nada para <publishUrl>C:\builds\MyProject\</publishUrl> WTF
  • el archivo zip que se crea es un desayuno de cerdos y está lleno de archivos que no son necesarios para la aplicación.

Cuando corro este perfil de publicación a través de visual studio, se crea una carpeta en * C:\builds\MyProject * y contiene los artefactos exactos que quiero.

¿Cómo obtengo este simple resultado de msbuild?

Author: P. Roe, 2013-04-27

5 answers

Para tu información: Tuve el mismo problema con Visual Studio 2015. Después de muchas horas tratando, ahora puedo hacer msbuild myproject.csproj /p:DeployOnBuild=true /p:PublishProfile=myprofile.

Tuve que editar mi .archivo csproj para que funcione. Contenía una línea como esta:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" 
  Condition="false" />

Cambié esta línea de la siguiente manera:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v14.0\WebApplications\Microsoft.WebApplication.targets" />

(Cambié 10.0 a 14.0, no estoy seguro de si esto era necesario. Pero definitivamente tuve que quitar la parte de la condición.)

 36
Author: johanv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-30 17:44:54

Encontré la respuesta aquí: http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild

Visual Studio 2010 tiene una gran nueva publicación de Proyectos de Aplicaciones Web características que le permiten publicar fácilmente su proyecto de aplicación web con un haga clic en un botón. Detrás de las escenas de la Web.transformación de configuración y la construcción de paquetes se realiza mediante un script MSBuild masivo que se importa en su archivo de proyecto (se encuentra en: C:\Program File (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web \ Microsoft.Web.Publicar.objetivo). Desafortunadamente, el guion es enormemente complicado, desordenado y indocumentado (otro entonces algunos a menudo mal escrito y en su mayoría inútil comentarios en el archivo). Un gran diagrama de flujo de ese archivo y algunos documentación sobre cómo engancharse en ella sería agradable, pero parece ser tristemente carente (o al menos no puedo encontrarlo).

Desafortunadamente, esto significa realizar la publicación a través de la línea de comandos es mucho más opaco de lo necesario. Me sorprendió la falta de documentación en esta área, porque en estos días muchas tiendas utilizan un servidor de integración continua y algunos incluso hacen implementación automatizada (con lo cual las funciones de publicación de VS2010 podrían ayudar mucho), así que hubiera pensado que habilitando esto (fácilmente!) habría sido un requisito bastante principal para la característica.

De todos modos, después de excavar a través de Microsoft.Web.Publicar.objetivo archivo durante horas y golpeando mi la cabeza contra la pared de prueba y error, Me las he arreglado para averiguar cómo Visual Studio parece realizar su magic one click "Publish to File System" y " Build Deployment Características del paquete". Voy a entrar en un poco de MSBuild scripting, así que si no estás familiarizado con MSBuild te sugiero que eches un vistazo a este accidente curso MSDN page.

Publicar en el Sistema de archivos

El Diálogo Publicar en el Sistema de Archivos de VS2010 yo un tiempo a la tuerca porque yo se espera un uso sensato de MSBuild que esté ocurriendo. En cambio, VS2010 hace algo bastante extraño: llama en MSBuild para realizar una especie de medio despliegue que prepara la web archivos de la aplicación en la carpeta obj de su proyecto, entonces parece hacer un manual copia de esos archivos (es decir. fuera de MSBuild) en su publicación de destino carpeta. Esto es realmente un comportamiento loco porque MSBuild está diseñado para copie archivos (y otras cosas relacionadas con la compilación), para que tenga sentido si todo el proceso fue solo un objetivo de MSBuild al que VS2010 llamó encendido, no un objetivo entonces una copia manual.

Esto significa que hacer esto a través de MSBuild en la línea de comandos no es como simple como invocar su archivo de proyecto con un destino particular y configuración de algunas propiedades. Tendrás que hacer lo que VS2010 debería tener hecho: cree usted mismo un objetivo que realice la mitad de la implementación copia los resultados a la carpeta de destino. Para editar el archivo de proyecto, haga clic derecho en el proyecto en VS2010 y haga clic en Descargar Proyecto, entonces haga clic derecho de nuevo y haga clic en Editar. Desplácese hacia abajo hasta que encuentre el Elemento de importación que importa los destinos de la aplicación web (Microsoft.Aplicación WEB.objetivos; este archivo en sí importa el Microsoft.Web.Publicar.archivo de objetivos mencionado anteriormente). Debajo esta línea agregaremos nuestro nuevo objetivo, llamado PublishToFileSystem:

<Target Name="PublishToFileSystem"
        DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
    <Error Condition="'$(PublishDestination)'==''"
           Text="The PublishDestination property must be set to the intended publishing destination." />
    <MakeDir Condition="!Exists($(PublishDestination))"
             Directories="$(PublishDestination)" />

    <ItemGroup>
        <PublishFiles Include="$(_PackageTempDir)\**\*.*" />
    </ItemGroup>

    <Copy SourceFiles="@(PublishFiles)"
          DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
          SkipUnchangedFiles="True" />
</Target>

Este objetivo depende de la PipelinePreDeployCopyAllFilesToOneFolder target, que es lo que VS2010 llama antes que lo haga su copia manual. Algunos cavando alrededor en Microsoft.Web.Publicar.targets muestra que llamar a este objetivo causa los archivos de proyecto que se colocarán en el directorio especificado por el propiedad _PackageTempDir.

La primera tarea que llamamos en nuestro destino es la tarea de error, sobre la cual hemos colocado una condición que asegura que la tarea solo suceda si la propiedad PublishDestination no se ha establecido. Esto te atrapará. y error en la compilación en caso de que haya olvidado especificar el PublishDestination propiedad. Luego llamamos a la tarea MakeDir para crear ese directorio PublishDestination si aún no existe.

Luego definimos un elemento llamado PublishFiles que representa todos los archivos encontrados en la carpeta _PackageTempDir. La tarea de copia es entonces llamado que copia todos esos archivos a la carpeta de destino de publicación. El atributo DestinationFiles en el elemento Copy es un poco complejo; realiza una transformación de los elementos y convierte su caminos hacia lo nuevo rutas arraigadas en la carpeta PublishDestination (echa un vistazo a Los conocidos Metadatos del elemento para ver qué significan esos %().

Para llamar a este objetivo desde la línea de comandos ahora podemos simplemente realizar este comando (obviamente cambiando el nombre y las propiedades del archivo de proyecto para usted):

msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
 39
Author: P. Roe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-29 20:59:37

Todavía tenía problemas después de probar todas las respuestas anteriores (uso Visual Studio 2013). No se copió nada en la carpeta de publicación.

La captura fue que si ejecuto MSBuild con un proyecto individual en lugar de una solución, tengo que poner un parámetro adicional que especifica la versión de Visual Studio:

/p:VisualStudioVersion=12.0

12.0 es para VS2013, reemplazar con la versión que utiliza. Una vez que agregué este parámetro, simplemente funcionó.

La línea de comandos completa se ve como esto:

MSBuild C:\PathToMyProject\MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=MyPublishProfile /p:VisualStudioVersion=12.0

Lo he encontrado aquí:

Http://www.asp.net/mvc/overview/deployment/visual-studio-web-deployment/command-line-deployment

Dicen:

Si especifica un proyecto individual en lugar de una solución, debe agregar un parámetro que especifique la versión de Visual Studio.

 18
Author: felix-b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-10 09:32:49

Me parece que su perfil de publicación no se está utilizando, y haciendo algún empaquetado predeterminado. Los objetivos de publicación web de Microsoft hacen todo lo que está haciendo anteriormente, selecciona los objetivos correctos en función de la configuración.

Conseguí que el mío funcionara sin problema desde el paso TeamCity MSBuild, pero sí especificé una ruta explícita al perfil, solo tienes que llamarlo por su nombre con no .pubxml (por ejemplo, FileSystemDebug). Se encontrará siempre y cuando en la carpeta estándar, que el suyo ser.

Ejemplo:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe ./ProjectRoot/MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=FileSystemDebug

Tenga en cuenta que esto se hizo utilizando las versiones de Visual Studio 2012 de los destinos de publicación web de Microsoft, que normalmente se encuentran en "C:\Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web". Consulte la carpeta deploy para ver los destinos de tipos de implementación específicos que se utilizan

 11
Author: GregS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-27 11:32:03

Primero verifique la versión de Visual studio del PC desarrollador que puede publicar la solución(proyecto). como se muestra es para VS 2013

 /p:VisualStudioVersion=12.0

Agregue la línea de comandos anterior para especificar qué tipo de versión de visual studio debe compilar el proyecto. Como respuestas anteriores, esto podría suceder cuando estamos tratando de publicar solo un proyecto, no toda la solución.

 0
Author: shammakalubo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-30 19:57:57