【问题标题】:MSBuild: how to create a global property?MSBuild:如何创建全局属性?
【发布时间】:2026-02-11 09:25:01
【问题描述】:

运行 MSBuild 时,在命令行中使用 /p:MyProp=value 传入的任何内容都可以从主脚本调用的每个 MSBuild 脚本(通过 MSBuild 任务)访问。如何在任务中定义可以从每个脚本中类似访问的属性?

例如:

Script1.proj:
[...]
<Target Name="Test">
  <MSBuild Projects="Script2.proj"/>
  <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/>
  <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/>
</Target>

Script2.proj:
[...]
<Target Name="Test">
  <!-- ??? Set GlobalProp2 = VALUE2 ??? -->
  <Message Text="Script2, GlobalProp1=$(GlobalProp1)"/>
  <Message Text="Script2, GlobalProp2=$(GlobalProp2)"/>
</Target>

如果像这样运行:msbuild Script1.proj /p:GlobalProp1=VALUE1 以上脚本产生以下输出:

Script2, GlobalProp1=VALUE1
Script2, GlobalProp2=
Script1, GlobalProp1=VALUE1
Script1, GlobalProp2=

我希望 Script2.proj 以某种方式设置 GlobalProp2 以产生以下输出:

Script2, GlobalProp1=VALUE1
Script2, GlobalProp2=VALUE2
Script1, GlobalProp1=VALUE1
Script1, GlobalProp2=VALUE2

这可能吗?如果可以,怎么做?

我看到了使用环境变量的建议,但似乎only 有帮助的情况是在 parent 脚本中设置变量时,并且child 脚本使用 Exec 任务调用(否则 env.variable 更改无效)。

【问题讨论】:

  • btw 环境变量在调用 VCBuild 任务时也会生效,而不仅仅是 Exec 任务

标签: msbuild msbuild-propertygroup


【解决方案1】:

由于您使用的是 MSBuild 任务,因此您必须使用 Properties 属性将所需的属性传递给调用,因此您应该将示例更改为。

<Target Name="Test">  
    <MSBuild Projects="Script2.proj" 
        Properties="GlobalProp1=$(GlobalProp1);GlobalProp2=$(GlobalProp2)"
    />  
    <Message Text="Script1, GlobalProp1=$(GlobalProp1)"/>  
    <Message Text="Script1, GlobalProp2=$(GlobalProp2)"/>
</Target>

属性必须显式传递,这是设计使然。

如果您想要更紧密的集成,那么您应该只导入将创建 1 个逻辑脚本的文件,而不是使用 MSBuild 任务。

【讨论】:

  • 不幸的是,这反过来不起作用 - 我想将在 Script2 中所做的更改传递回 Script1
  • 您应该修改您的流程以仅导入文件,而不是使用 MSBuild 任务的脚本。这提供了更紧密的集成。
  • 完美 - 导入脚本是迄今为止唯一有效的方法。如果您在回答中提到这一点,我会将其标记为已接受。
  • 如果你知道这个回答有多大帮助!非常感谢:-)
【解决方案2】:

您可以使用 rsp 文件来定义全局属性。这些属性对子项目可见。

【讨论】:

  • 我看不到我的“子脚本”(Script2.proj) 将如何更改它们。是否可以使用 .rsp 文件执行我在问题中描述的操作?