TFS 2015能否让构建变量访问其他构建变量?

15

当我在新的TFS 2015团队构建中定义自定义变量如下所示:
名称:SomeOutput
值:$(System.DefaultWorkingDirectory)\Some

... 它似乎没有扩展 $(System.DefaultWorkingDirectory)
有没有什么办法解决这个问题?

编辑:
至少看起来不是在任何地方都扩展。

例如,在MSBuild-Arguments中,/p:OUTPUT="$(SomeOutput)" 扩展为 /p:OUTPUT="C:\TfsData\BuildAgents\_work\3\s\Some",但当我添加一个命令行构建任务,并将其工具设置为cmd并将参数设置为/k set时,它打印出:
SOMEOUTPUT=$(System.DefaultWorkingDirectory)\Some

编辑2:
这是我的变量
variables

这是我的工作流步骤
workflow

这是构建输出
build output


1
你是如何通过cmd使用它的?哪个cmd命令行?你能提供更详细的信息,比如cmd截图吗? - PatrickLu-MSFT
3个回答

10
你可以从Visual Studio Marketplace使用VSTS变量任务扩展

When you define a variable in the Variables screen and use other variables as value, they won't be expanded (as you may have expected). Instead the literal text is passed to the tasks in the workflow. Without this little task the following configuration won't work:

Variable              Value
Build.DropLocation    \\share\drops\$(Build.DefinitionName)\$(Build.BuildNumber)

By adding the Expand variable(s) task to the top of your workflow, it will take care of the expansion, so any task below it will receive the value you're after.

https://github.com/jessehouwing/vsts-variable-tasks/wiki/Expand-Variable

PS:新代理(2.x版本)现在自动展开变量。


4

这是可以实现的。

你可能需要使用% %而不是$来调用cmd中的变量以打印结果。在命令前面添加call也是必要的。以下是一个简单的例子:cmd prompt expansion of variables example

注意:System.DefaultWorkingDirectorycmd中不可用(不确定为什么);你需要使用System_DefaultWorkingDirectory代替。详细信息可以查看日志。


在我的环境中得到相同的结果。不确定CMD是否支持此功能。明天会再次确认并更新我的答案。 - PatrickLu-MSFT
嗨,快到明天了 :) 有什么消息要分享吗? - Suchiman
如果不确定为什么要这样做,可以在此处查看解释:https://msdn.microsoft.com/zh-cn/Library/vs/alm/Build/scripts/variables(请参阅“秘密变量”上面的段落)。我确实知道这是如何工作的,但我仍然认为这是一种变通方法。我必须将`Some`声明为`%BUILD_STAGINGDIRECTORY%\Some`,这将不允许在脚本上下文之外使用此变量。在导出到环境之前,构建代理应该尝试扩展所有的`$(...)`变量。 - Suchiman
@Suchiman 看起来似乎不是这样。至少测试结果是符合的。Build Agent 只会将 $(Some) 扩展为 Some= $XX ,而 $XX 将在使用它的环境中扩展。因为 $ 在 cmd 中不被支持,所以 cmd 认为 $XX 只是 $XX 并将其打印出来。而 MsBuild 支持 $。这就是为什么你可以得到正确的结果。我在想这是否是因为 Vnext Build Agent 是逐步运行的, 在执行 cmd 步骤之前,代理程序不会使用 $XX,当然也不会扩展它。 - PatrickLu-MSFT
到目前为止,感谢您。我的观点是,这不仅在msbuild中有效,而且在构建代理文本框中也有效。例如:如果您创建批处理脚本构建步骤,并将$(Some)传递为参数,则它将接收正确的结果“C:\ a \ 1 \ a \ Some”,而不是“$(Build.StagingDirectory)\ Some”。在导出环境变量时使其正常工作似乎很自然。 - Suchiman
显示剩余2条评论

2
我遇到了同样的问题 - 希望拼接由多个内置变量组成的路径并将其传递给PS脚本。
解决方法: 最终我通过相应生成的环境变量(例如$env:BUILD_SOURCESDIRECTORY)在实际脚本中合并了这些变量。虽然不是我最初想要的方式,但至少它可以工作。缺点是如果我需要更改路径,我必须始终更改PS脚本而不是构建变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接