It is important to realize that when you use a “MSBuild” task, a new child MSBuild process will be started. The implication of this is that any items and properties you define in the parent MSBuild process will not be automatically passed to/visible from the child MSBuild process unless you explicitely pass them via Properties
attribute on MSBuild
element (as in <MSbuild Properties="..." />
).
To answer your question, I wrote the following self-contained example that runs a child MSBuild project for all the specified configurations:
-
First, create a directory for your MSBuild experiment (for example I used
C:\temp\msbuildtest
) -
In this directory, create the first file,
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>
-
In the same directory, create the second file,
child.proj
(in your case this would be the actual C# project you’re trying to build, but because I’m trying to illustrate my point, I am using a simple child project that instead of running C# compiler just prints values of properties 🙂 )<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>
-
Now you can run the example. First the default, if you don’t explicitly specify configurations to build:
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
And then explicitly specified multiple configurations:
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
You should be able to adapt this technique to your situation.