MSBuild:如何创建全局属性?

时间:2009-12-24 19:34:33

标签: msbuild msbuild-propertygroup

运行MSBuild时,可以从主脚本调用的每个MSBuild脚本(通过/p:MyProp=value任务)访问使用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任务调用 child 脚本(否则env.variable更改无效)。

2 个答案:

答案 0 :(得分:6)

由于您正在使用MSBuild任务,因此必须使用“属性”属性将所需属性传递给调用,因此您应将示例更改为。

<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任务。

答案 1 :(得分:5)

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