MSBuild:如何创建全局属性?

Rom*_*kov 3 msbuild msbuild-propertygroup

运行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>
Run Code Online (Sandbox Code Playgroud)

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

Script2, GlobalProp1=VALUE1
Script2, GlobalProp2=
Script1, GlobalProp1=VALUE1
Script1, GlobalProp2=
Run Code Online (Sandbox Code Playgroud)

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

Script2, GlobalProp1=VALUE1
Script2, GlobalProp2=VALUE2
Script1, GlobalProp1=VALUE1
Script1, GlobalProp2=VALUE2
Run Code Online (Sandbox Code Playgroud)

这是可能的,如果是的话,怎么样?

我已经看到了使用环境变量的建议,但似乎唯一有帮助的情况是在脚本中设置变量,并且使用Exec任务调用脚本(否则env.variable变更具有没有效果).

Say*_*imi 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>
Run Code Online (Sandbox Code Playgroud)

必须明确传递属性,这是设计的.

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

  • 您应该修改您的进程以仅导入文件,而不是使用MSBuild任务使用脚本.这提供了更加重要的整合. (2认同)

小智 5

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