在msbuild(12.0)命令行属性赋值

时间:2015-12-10 20:59:19

标签: msbuild macros tfs2012

我很好奇,是否可以在MSBuild的命令行属性赋值中引用宏?

例如:

msbuild.exe MySolution.sln /p:CustomBeforeMicrosoftCSharpTargets="$(SolutionDir)\custom.targets"

从连接到TFS的Visual Studio的“编辑构建定义”/“队列新构建”中指定为“MSBuildArguments”时,这是否也可以工作?

E.g:

/p:CustomBeforeMicrosoftCSharpTargets="$(SolutionDir)\custom.targets"

因为它似乎没有为我导入这些目标。但是目标文件肯定存在于构建工作区中的解决方案中。

我不想指定绝对路径。不确定如何使用相对路径在这里工作,在互联网上找不到任何建议,并且调试它非常困难,因为它是使用工作流在构建代理上调用的。工作流日志记录肯定是报告它使用这些参数调用MSBuild,但是在详细日志记录输出中没有任何地方可以看到它正在引用CustomBeforeMicrosoftCSharpTargets目标或调用它。

修改

我写了一个小测试构建项目buildme.proj以进一步理解。

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
    <SetMe>NotInTheSandbox</SetMe>
</PropertyGroup>

<PropertyGroup>
    <SomeMacroValue>c:\Sandbox\BuildTest</SomeMacroValue>
</PropertyGroup>

<PropertyGroup>
    <AlreadySet>$(SomeMacroValue)\InTheSandbox</AlreadySet>
</PropertyGroup>

<Target Name="Build">
    <Message Text="I am building!" />
    <Message Text="Some macro value: $(SomeMacroValue)" />
    <Message Text="$(SetMe)" />
    <Message Text="$(AlreadySet)" />
</Target>

</Project>

当我使用命令执行时:

msbuild buildme.proj /p:SetMe="$(SomeMacroValue)\StillNotInSandbox"

我得到以下输出:

Microsoft (R) Build Engine version 12.0.31101.0
[Microsoft .NET Framework, version 4.0.30319.42000]
Copyright (C) Microsoft Corporation. All rights reserved.

Build started 10/12/2015 22:12:08.
Project "C:\Sandbox\BuildTest\buildme.proj" on node 1 (default targets).
Build:
  I am building!
  Some macro value: c:\Sandbox\BuildTest
  $(SomeMacroValue)\StillNotInSandbox
  c:\Sandbox\BuildTest\InTheSandbox
Done Building Project "C:\Sandbox\BuildTest\buildme.proj" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:00.02

很明显,它的表现不符合我的预期:宏标识符出现在输出消息文本中。

有解决方法吗?

1 个答案:

答案 0 :(得分:1)

A&#34;宏&#34;像$(SolutionDir)只存在于VisualStudio中,VS将值传递给MSBuild。

而MSBuild使环境变量可用properties,因此像这样的批处理文件

set SomeMacroValue=foo
msbuild buildme.proj /p:SetMe="$(SomeMacroValue)\StillNotInSandbox"

可能就是你要找的东西。 您可以为每个用户或每台机器设置环境变量(控制面板\所有控制面板项目\系统 高级系统设置环境变量 )。