Stécy
Stécy

Reputation: 12339

Using MSBuild 4.0, passing property name to be expanded in c# project file from MSBuild task, how?

I created a MSBuild script for our CI process and in this script I use a MSBuild task to compile the solution:

<PropertyGroup>
    <MyOutPath>Output</MyOutPath>
</PropertyGroup>

<MSBuild
    Projects="MySolution.sln"
    Targets="Clean;Rebuild"
    Properties="OutputPath=$(MyOutPath)\%24(AssemblyName)">
</MSBuild>

I want the c# project files to use an output path like

The AssemblyName property is from the C# project file and I want it to be expanded in the OutputPath property when building the project.

Right now, %24(AssemblyName) just produce Output\$(AssemblyName) on the filesystem which is not what I want.

Not surprisingly, using $(AssemblyName) expands to nothing in the "parent" MSBuild file.

Is there any way to defer the resolution of the AssemblyName property later in the target project file?

Also, I do not want to modify the .csproj file as I want the least impact from the CI system.

Upvotes: 3

Views: 1219

Answers (1)

Enrico Campidoglio
Enrico Campidoglio

Reputation: 59885

You could import the .csproj project file directly into your MSBuild script using the Import element. This way you could reference the AssemblyName property directly:

<Import Project="MyProject.csproj" />
<Message Text="The assembly name is $(AssemblyName)" />

If you need to import the contents of a .sln solution file, first you'll have to convert it to an MSBuild project file by setting the MSBuildEmitSolution environment variable to 1 and run MSBuild on the solution file. This will generate a MySolution.sln.proj file, which you can then import into your script like described before:

<SetEnv Name="MSBuildEmitSolution" Value="1" />
<MSBuild Projects="MySolution.sln" Targets="Build" />
<Import Project="MySolution.sln.proj" />

Upvotes: 3

Related Questions