(TFS构建的)自定义变量不能用表达式填充

时间:2020-02-26 17:32:14

标签: tfs azure-devops tfsbuild

在构建定义中(在“变量”选项卡上),我尝试使用简单表达式Build.Repository.Clean定义自定义变量($[not(false)])。但是当我在构建过程中打印变量时,无论使用什么表达式,Build.Repository.Clean的值始终为false

奇怪的是,使用类似$(FullBuild)(其中FullBuild是另一个自定义变量)的定义就可以了。

我想念什么吗?

注意:

  • 使用TFS 2018

背景故事:

尝试根据自定义变量Build.Repository.Clean设置QuickBuild变量(可以由用户在开始构建时设置)。尝试指定$[not(variables.QuickBuild)](以及同一表达式的其他变体)–祝您好运。

这是现在的工作方式(但我宁愿使用QuickBuild而不是FullBuild-只是想不出如何对变量求反):

build process variables

2 个答案:

答案 0 :(得分:0)

更新3:

好吧,忽略它是否在队列时间内更改了清理操作。对于您要寻找的内容,可以尝试以下格式:

Build.Repository.Clean=$[not(eq(variables.QuickBuild,'True'))]

  • 如果QuickBuild=TrueBuild.Repository.Clean=False
  • 如果QuickBuild=False,则Build.Repository.Clean.Clean=True

例如:

我已经在“获取源代码”步骤中设置了clean选项,Clean = true

Build.Repository.Clean=$(FullBuild)

FullBuild=false

enter image description here

enter image description here

现在,当我对构建进行排队时,然后尝试在排队期间更改FullBuild=false 时间。

您认为,Build.Repository.Clean应该更改为False,否则将不执行clean操作。 但是事实是,Build.Repository.Clean仍然为True,并且执行清理。

enter image description here

即使您没有在队列时间内更新FullBuild=false的值,也可以直接在构建管道中设置值FullBuild=false。这也不会使用。

反之,如果您在“获取源代码”步骤中将Clean设置为false。无论您在队列建立期间在FullBuildBuild.Repostiory.Clean中输入哪种值。

在构建管道期间它不会清理。

enter image description here

结论:在队列时间内无法更改清理操作。这根本不与任何表达式相关。不管为Build.Repository.Clean设置什么样的值。


更新2

再次回答您的问题和所有评论。您的真正目标似乎是在队列时间基于另一个自定义变量分配清除选项

enter image description here

由于您无法在队列时间内更改Build.Repository.Clean。因此,您正在尝试使用此替代方法。不支持。 无法在队列时间分配清理选项

您可能必须在构建管道中预定义此变量。

还要看一下这个问题:How to clean build using self-hosted agent when queuing

在您的方案中,您可以创建两个构建管道作为一个丑陋的解决方法。一个用于增量构建(在获取源代码步骤中使用Disable the Clean option,或使用变量Build.Repository.Clean = False),另一个用于启用“清理”选项。

希望很明显。

答案 1 :(得分:0)

Expressions用于初始化自定义变量时(在Variables选项卡上),不进行评估。即变量值最终是一个string,其值等于您的表达式(例如'$[not(<whatever>)]')。稍后,当该变量在期望boolean的上下文中使用时-仍然不会得到评估,而是得到type-casted,并且任何非空字符串都会产生true

另一方面,发生了变量替换,即值$(MyVar)被替换为MyVar的值。

内置变量在某种意义上似乎是特殊的,如果您override,则此过程从一开始就发生,并且其值立即被结果值替换。

注意-这可能(也可能不)与this有关。

底线::您不能使用表达式来覆盖内置变量的值。