3

/p:MyProp=value运行 MSBuild 时,可以从主脚本调用(通过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 任务调用脚本(否则 env.variable 更改有没有效果)。

4

2 回答 2

6

由于您使用的是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 任务。

于 2009-12-25T03:04:48.913 回答
5

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

于 2012-11-07T08:01:12.417 回答