我很好奇,是否可以在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
很明显,它的表现不符合我的预期:宏标识符出现在输出消息文本中。
有解决方法吗?
答案 0 :(得分:1)
A&#34;宏&#34;像$(SolutionDir)只存在于VisualStudio中,VS将值传递给MSBuild。
而MSBuild使环境变量可用properties,因此像这样的批处理文件
set SomeMacroValue=foo
msbuild buildme.proj /p:SetMe="$(SomeMacroValue)\StillNotInSandbox"
可能就是你要找的东西。 您可以为每个用户或每台机器设置环境变量(控制面板\所有控制面板项目\系统 高级系统设置,环境变量 )。