【问题标题】:Using MSBuild 4.0, passing property name to be expanded in c# project file from MSBuild task, how?使用 MSBuild 4.0,从 MSBuild 任务传递要在 c# 项目文件中扩展的属性名称,如何?
【发布时间】:2011-09-13 19:32:31
【问题描述】:

我为我们的 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) 只是在文件系统上生成 Output\$(AssemblyName),这不是我想要的。

毫不奇怪,使用 $(AssemblyName) 在“父”MSBuild 文件中扩展为空。

有没有办法在目标项目文件中推迟对 AssemblyName 属性的解析?

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

【问题讨论】:

    标签: c# msbuild


    【解决方案1】:

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

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

    如果您需要导入.sln 解决方案文件的内容,首先您必须通过将MSBuildEmitSolution 环境变量设置为1 来导入convert it to an MSBuild project file,然后在解决方案文件上运行MSBuild。这将生成一个MySolution.sln.proj 文件,然后您可以将其导入到您的脚本中,如前所述:

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

    【讨论】:

    • 嗯,我有一个解决方案引用了几个项目文件,并且所有项目文件都是事先不知道的。 Import 是否支持项目?
    • 此外,我的解决方案不一定包含所有项目,因此我必须解析 sln 文件以处理正确的项目文件。
    • 如果您使用的是 MSBuild 4.0,Import 元素实际上支持通配符,因此您可以说 &lt;Import Project="SomePath\*.csproj" /&gt; 来导入特定目录中的所有项目文件。
    • 仍然根据解决方案文件的内容排除一些项目。
    猜你喜欢
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 2011-10-20
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多