使用MSBuild 4.0,从MSBuild任务传递要在c#项目文件中展开的属性名,如何

本文关键字:MSBuild 项目文件 属性 如何 任务 使用 | 更新日期: 2023-09-27 18:08:34

我为我们的CI过程创建了一个MSBuild脚本,在这个脚本中,我使用MSBuild任务来编译解决方案:

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

我希望c#项目文件使用像

这样的输出路径
  • 项目MyAssemblyName1的输出'MyAssemblyName1
  • 项目MyAssemblyName2的输出'MyAssemblyName2

AssemblyName属性来自c#项目文件,我希望在构建项目时在OutputPath属性中展开它。

现在,%24(AssemblyName)只是在文件系统上产生输出'$(AssemblyName),这不是我想要的。

毫不奇怪,使用$(AssemblyName)在"父"MSBuild文件中展开为零。

是否有任何方法可以延迟目标项目文件中AssemblyName属性的解析?

另外,我不想修改.csproj文件,因为我希望CI系统对我的影响最小。

使用MSBuild 4.0,从MSBuild任务传递要在c#项目文件中展开的属性名,如何

您可以使用 import 元素将.csproj项目文件直接导入到MSBuild脚本中。这样您就可以直接引用AssemblyName属性:

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

如果您需要导入.sln解决方案文件的内容,首先您必须通过将MSBuildEmitSolution环境变量设置为1并在解决方案文件上运行MSBuild将其转换为MSBuild项目文件。这将生成一个MySolution.sln.proj文件,然后您可以像前面描述的那样将其导入到脚本中:

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