www tag manager link gtm googletagmanager google eventos agregar msbuild

msbuild - manager - universal analytics tag



¿Cómo puedo construir múltiples configuraciones en paralelo? (1)

Aproveche la opción BuildInParallel de MSBuild Task y pase todos los proyectos en una sola llamada. Los ejemplos here dan el enfoque básico:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <ProjectToBuild Include="a1.sln"> <Properties>Configuration=Debug</Properties> </ProjectToBuild> <ProjectToBuild Include="a1.sln"> <Properties>Configuration=Release</Properties> </ProjectToBuild> </ItemGroup> <Target Name="Build"> <MSBuild Projects="@(ProjectToBuild)" BuildInParallel="true" /> </Target> </Project>

Tengo una solución de Visual Studio 2012 con doce configuraciones de soluciones. Cada configuración de la solución es independiente (es decir, las salidas de cada configuración no tienen ninguna relación).

La pregunta: ¿Cómo puedo crear las doce configuraciones en un solo paso, es decir, ejecutando un solo comando MSBuild en la línea de comandos, y cómo puedo hacer que las configuraciones se construyan en paralelo?

Como ejemplo, si hubiera solo dos configuraciones, Release / AnyCPU y Debug / AnyCPU, me gustaría que ambas se construyeran al mismo tiempo, en paralelo.

Para completar, lo siguiente es lo que he intentado; Todavía no tengo una solución a este problema.

Para compilar todos los proyectos a la vez, creé un nuevo archivo de proyecto con un objetivo de compilación que ejecuta la tarea de MSBuild en el archivo de solución para cada configuración:

<Target Name="Build"> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release;Platform=Win32" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release;Platform=x64" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release;Platform=ARM" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release(ZW);Platform=Win32" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release(ZW);Platform=x64" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Release(ZW);Platform=ARM" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug;Platform=Win32" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug;Platform=x64" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug;Platform=ARM" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug(ZW);Platform=Win32" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug(ZW);Platform=x64" Targets="$(BuildCommand)" /> <MSBuild Projects="cxxreflect.sln" Properties="SolutionDir=$(MSBuildProjectDirectory)/;Configuration=Debug(ZW);Platform=ARM" Targets="$(BuildCommand)" /> </Target>

Esto funciona muy bien, excepto que cada tarea de MSBuild se invoca en secuencia, por lo que no hay un paralelismo (sí, hay un paralelismo dentro de cada configuración de configuración, pero realmente me gustaría obtener el paralelismo entre las configuraciones de configuración).

En un intento de obtener las configuraciones para construir en paralelo, intenté hacer uso de la propiedad BuildInParallel de la tarea MSBuild. Escribí una tarea previa a la compilación que generaba archivos de proyecto para cada configuración, luego intenté construir todos estos proyectos generados en paralelo:

<Target Name="PreBuild" Outputs="%(ProjectConfiguration.Identity)" Returns="%(BuildProject.Identity)"> <Message Text="Cloning Solution for Configuration: %(ProjectConfiguration.Identity)" /> <PropertyGroup> <BuildProjectPath>$(IntPath)/%(ProjectConfiguration.Platform)/%(ProjectConfiguration.Configuration)/build.proj</BuildProjectPath> </PropertyGroup> <ItemGroup> <BuildProject Include="$(BuildProjectPath)" /> </ItemGroup> <MakeDir Directories="$(IntPath)/%(ProjectConfiguration.Platform)/%(ProjectConfiguration.Configuration)" /> <WriteLinesToFile File="$(BuildProjectPath)" Lines="&lt;?xml version=''1.0'' encoding=''utf-8''?&gt; &lt;Project DefaultTargets=''Build'' ToolsVersion=''4.0'' xmlns=''http://schemas.microsoft.com/developer/msbuild/2003''> &lt;Target Name=''Build''&gt; &lt;MSBuild Projects=''$(SlnPath)'' Properties='' SolutionDir=$(MSBuildProjectDirectory)/%3b Configuration=%(ProjectConfiguration.Configuration)%3b Platform=%(ProjectConfiguration.Platform) '' Targets=''$(BuildCommand)'' /&gt; &lt;/Target&gt; &lt;/Project&gt;" Overwrite="true" /> </Target> <Target Name="Build" DependsOnTargets="PreBuild"> <Message Text="%(BuildProject.Identity)" /> <MSBuild Projects="%(BuildProject.Identity)" Properties="BuildCommand=$(BuildCommand)" BuildInParallel="true" /> </Target>

Desafortunadamente, mientras esto construye las doce configuraciones, las construye en serie. Mi conjetura es que cuando MSBuild realiza un análisis de dependencia en el conjunto de proyectos que se construirán, identifica que todos dependen del mismo archivo de Solución, por lo que decide que no se pueden construir en paralelo. (Esto es solo una suposición; podría estar completamente equivocado. Sé muy poco acerca de MSBuild).

También estoy usando el modificador / m al construir.