运行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更改无效)。
答案 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文件来定义全局属性。子项目可以看到这些属性。