使用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系统对我的影响最小。
您可以使用 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" />