MSBuild:如何创建全局属性?

6
在运行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

这是否可行,如果可以,要怎么做呢?

我看过使用环境变量的建议,但似乎唯一有帮助的情况是当该变量在父脚本中被设置,并且使用Exec任务调用子脚本时(否则环境变量更改无效)。


顺便说一下,环境变量在调用VCBuild任务时也会生效,而不仅仅是在执行任务时生效。 - stijn
2个回答

7

由于您正在使用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>

这些属性必须显式传递,这是有意设计的。

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


不幸的是,这种情况不能反过来 - 我想将在Script2中进行的更改传递回Script1 - Roman Starkov
2
不要使用脚本,而是使用MSBuild任务,然后修改您的流程以导入文件。这提供了更紧密的集成。 - Sayed Ibrahim Hashimi
完美 - 目前为止,导入脚本是唯一有效的方法。如果您在答案中提到这一点,我将标记此答案为已接受。 - Roman Starkov
如果你知道这个答案有多大的帮助,那就太感谢了!非常感谢 :-) - MaYaN

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

我看不出我的“sub-script”(Script2.proj)如何能够改变它们。使用.rsp文件是否可以实现我在问题描述中所描述的操作? - Roman Starkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接