artifactstagingdirectory - msbuild target parameter
Usando MSBuild para construir mĂșltiples configuraciones (3)
Algo está mal en su archivo de proyecto. Considera este XML:
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == '''' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>C:/Folder/Etc/Output/$(Configuration)/</OutputPath>
...
</PropertyGroup>
Esas propiedades nunca se pueden establecer, ya que incluso si $ (Configuración) y $ (Plataforma) están vacías, nunca pueden coincidir con la cadena vacía cuando se concatinan con el carácter de barra; el valor mínimo para esa condición es ''|'' y no ''''. Incluso si se corrige al hacer que la condición se compare con ''|'', luego intente usar $ (Configuración) en el OutputPath en ese Grupo de propiedades, pero $ (Configuración) nunca tendrá un valor en el punto en que se usa. Del mismo modo, cuando intenta establecer $ (Plataforma) en ''AnyCPU'', ya debe tener ese valor. Probablemente quiso omitir la condición en el primer PropertyGroup por completo, y es posible que deba proporcionar valores predeterminados para $ (Configuración) y $ (Plataforma) en un PropertyGroup inicial sin condiciones. Diferencie todo su proyecto contra un nuevo proyecto y vea si hay otras rarezas como esta presente.
También tenga en cuenta que en su anulación del objetivo "Generar", tiene una condición redundante en la tarea de MSBuild; con la misma condición en la que no lo necesita en ninguna de las tareas.
Estoy intentando editar el archivo de mi proyecto para permitirme tener un proyecto que genere múltiples configuraciones de compilación a la vez. Lo he hecho utilizando un enfoque de procesamiento por lotes y utilizando la tarea de MSBuild (ver más abajo).
Si ejecuto el script, obtengo un error:
Error 103 La propiedad OutputPath no está establecida para el proyecto "ThisMSBuildProjectFile.csproj". Asegúrese de haber especificado una combinación válida de Configuración y Plataforma para este proyecto. Configuración = ''Debug'' Plataforma = ''AnyCPU''.
Obtengo esto si agrego u omito el OutputPath de la tarea de MSBuild. Si se usa el depurador VS2010 para recorrer el script y se llama a la tarea de MSBuild, el depurador ingresa nuevamente en el archivo y luego ingresa en OutputPath, entonces afaik, debería tomar ese valor, ¿no?
Cualquier ayuda para esto sería muy apreciada, me está volviendo loco. Gracias paul
ThisMSBuildProjectFile.csproj (material excedente retirado):
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<!-- Only Import normal targets if not building multiple projects -->
<Import Project="$(MSBuildToolsPath)/Microsoft.CSharp.targets" Condition="''$(Configuration)|$(Platform)'' != ''AllBuild|AnyCPU'' "/>
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == '''' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>C:/Folder/Etc/Output/$(Configuration)/</OutputPath>
<OutDir>C:/Folder/Etc/Output/$(Configuration)/</OutDir>
<BaseOutputPath>C:/Folder/Etc/Output/$(Configuration)/</BaseOutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<!-- Common -->
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == ''Debug|AnyCPU'' ">
<Platform>AnyCPU</Platform>
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == ''Release|AnyCPU'' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<ItemGroup>
<Projects Include="C:/Folder/Etc/ThisMSBuildProjectFile.csproj" />
</ItemGroup>
<!-- Call this project file again, but with a different configuration - if this was working, this would call multiple build configs -->
<Target Name="Build" Condition="''$(Configuration)|$(Platform)'' == ''AllBuild|AnyCPU'' ">
<Message Text="hm!"/>
<!-- Tried thiswith and without the OutputPath property - makes no difference. -->
<MSBuild Projects="@(Projects)" Properties="Configuration=Debug;OutputPath=C:/Folder/Etc/Output/" ToolsVersion="4.0" Condition="''$(Configuration)|$(Platform)'' == ''AllBuild|AnyCPU'' "/>
</Target>
<PropertyGroup Condition=" ''$(Configuration)|$(Platform)'' == ''AllBuild|AnyCPU'' ">
<!-- Repeated properties from above here (including, of course, OutputPath) -->
</PropertyGroup>
<!-- Project files -->
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties/AssemblyInfo.cs" />
<Compile Include="Blah/Blah.cs" />
</ItemGroup>
Es importante darse cuenta de que cuando utiliza una tarea "MSBuild", se iniciará un nuevo proceso secundario de MSBuild. La implicación de esto es que los elementos y propiedades que defina en el proceso MSBuild principal no pasarán automáticamente / visibles desde el proceso MSBuild secundario a menos que los pase explícitamente a través del atributo Properties
en el elemento MSBuild
(como en <MSbuild Properties="..." />
).
Para responder a su pregunta, escribí el siguiente ejemplo independiente que ejecuta un proyecto MSBuild secundario para todas las configuraciones especificadas:
Primero, cree un directorio para su experimento de MSBuild (por ejemplo, utilicé
C:/temp/msbuildtest
)En este directorio, crea el primer archivo,
main.proj
:<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0"> <ItemGroup> <ConfigList Condition=" ''@(ConfigList)'' == '''' and $(Config) != '''' " Include="$(Config.Split(''+''))" /><!-- parse all requested configurations into a list --> <ConfigList Condition=" ''@(ConfigList)'' == '''' " Include="Debug" /><!-- if no configurations were specified, default to Debug --> </ItemGroup> <!-- Build the child project for each requested configuration. --> <Target Name="Build"> <MSBuild Projects="$(MSBuildProjectDirectory)/child.proj" Properties="Configuration=%(ConfigList.Identity);OutputPath=$(MSBuildProjectDirectory)/bin/%(ConfigList.Identity)" Targets="Build" /> </Target> </Project>
En el mismo directorio, cree el segundo archivo,
child.proj
(en su caso, este sería el proyecto real de C # que está tratando de construir, pero debido a que estoy tratando de ilustrar mi punto, estoy usando un proyecto secundario simple que en lugar de ejecutar el compilador de C # solo imprime valores de propiedades :-))<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0"> <Target Name="Build"> <Message Text="Building configuration $(Configuration) with output path $(OutputPath)" Importance="High" /> </Target> </Project>
Ahora puedes ejecutar el ejemplo. Primero el predeterminado, si no especifica explícitamente las configuraciones para construir:
C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/msbuild main.proj > (cut the noise) > Build: > Building configuration Debug with output path C:/temp_c/d/bin/Debug
Y luego especificó explícitamente múltiples configuraciones:
C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/msbuild main.proj /property:Config=Debug+Release+Staging+Production > (cut the noise) > Build: > Building configuration Debug with output path C:/temp_c/d/bin/Debug > Build: > Building configuration Release with output path C:/temp_c/d/bin/Release > Build: > Building configuration Staging with output path C:/temp_c/d/bin/Staging > Build: > Building configuration Production with output path C:/temp_c/d/bin/Production
Debes poder adaptar esta técnica a tu situación.
No estoy seguro de si quisiera pasar por una configuración tan complicada del propio archivo csproj del proyecto. Prefiero instalar un archivo de MSBuild "BuildBoth.proj" que tenga un objetivo específico llamado "Ambos" que genere la solución en ambas configuraciones.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Both">
<!-- Calls twice for both configs -->
<Target Name="Both">
<MSBuild Projects="buildboth.sln" Targets="Rebuild" Properties="Configuration=Debug"
StopOnFirstFailure="true">
</MSBuild>
<MSBuild Projects="buildboth.sln" Targets="Rebuild" Properties="Configuration=Release"
StopOnFirstFailure="true">
</MSBuild>
</Target>
<!-- single config targets
<Target Name="Debug">
<MSBuild Projects="buildboth.sln" Targets="Rebuild" Properties="Configuration=Debug"
StopOnFirstFailure="true">
</MSBuild>
</Target>
<Target Name="Release">
<MSBuild Projects="buildboth.sln" Targets="Rebuild" Properties="Configuration=Release"
StopOnFirstFailure="true">
</MSBuild>
</Target>
-->
</Project>
Luego ejecuté el comando (verbosity set Minimal) para apuntar a Both
C:/Projects/experiments/BuildBoth>msbuild /v:m /target:Both BuildBoth.proj
Microsoft (R) Build Engine Version 4.0.30319.1
[Microsoft .NET Framework, Version 4.0.30319.225]
Copyright (C) Microsoft Corporation 2007. All rights reserved.
BothWpf -> C:/Projects/experiments/BuildBoth/BothWpf/bin/Debug/BothWpf.exe
BothWpf -> C:/Projects/experiments/BuildBoth/BothWpf/bin/Release/BothWpf.exe