(TFS构建的)自定义变量可以';不要用表情填充

(TFS构建的)自定义变量可以';不要用表情填充,tfs,azure-devops,tfsbuild,Tfs,Azure Devops,Tfsbuild,在构建定义(在变量选项卡上)中,我尝试使用简单表达式$[not(false)]定义自定义变量(build.Repository.Clean)。但当我在构建过程中打印变量时——不管使用了什么表达式,build.Repository.Clean值总是false 奇怪的是,用$(FullBuild)(其中FullBuild是另一个自定义变量)这样的东西定义它就可以了 我错过什么了吗 注: 使用TFS 2018 背景故事: 尝试设置Build.Repository.Clean变量,具体取决于自定义变

在构建定义(在变量选项卡上)中,我尝试使用简单表达式
$[not(false)]
定义自定义变量(
build.Repository.Clean
)。但当我在构建过程中打印变量时——不管使用了什么表达式,
build.Repository.Clean
值总是
false

奇怪的是,用
$(FullBuild)
(其中
FullBuild
是另一个自定义变量)这样的东西定义它就可以了

我错过什么了吗

注:

  • 使用TFS 2018
背景故事:

尝试设置
Build.Repository.Clean
变量,具体取决于自定义变量
QuickBuild
(可由用户在启动生成时设置)。尝试指定
$[not(variables.QuickBuild)]
(以及相同表达式的其他变体)--运气不好

下面是它现在的工作原理(但我宁愿使用
QuickBuild
而不是
FullBuild
——只是不知道如何对变量求反):


更新3:

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

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

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

例如:

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

Build.Repository.Clean=$(FullBuild)

FullBuild=false

现在,当我对构建进行排队时,请尝试在排队过程中更改
FullBuild=false
时间

按照您的想法,Build.Repository.Clean应该更改为False,然后将不会执行Clean操作但事实是,Build.Repository.Clean仍然是真的,并且Clean已被执行。

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

相反,如果在获取源代码步骤中设置Clean=false。无论您在队列生成期间在
FullBuild
Build.repository.Clean
中输入什么类型的值

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

结论:在排队时间内,无法更改清洁操作。这与任何表达式都没有关系。无论您为
Build.Repository.Clean
设置了什么类型的值


更新2

之后,再次检查您的问题和所有评论。似乎您真正的目标是基于另一个自定义变量在队列时间分配clean选项

因为您无法在排队期间更改
Build.Repository.Clean
。因此,您正在尝试使用此变通方法。这不是支持无法在排队时分配清除选项

您可能必须在生成管道中预先定义此变量

再看看这个问题:

在您的场景中,您可以创建两个构建管道作为一个难看的解决方法。一个用于增量构建(在获取源代码步骤中,或使用变量
build.Repository.Clean
=False),另一个用于启用Clean选项

希望清楚。

用于初始化自定义变量时(在
变量
选项卡上)不会进行计算。也就是说,变量值最终是一个
字符串
,其值等于您的表达式(例如
“$[not()]”
)。稍后,当该变量在期望
布尔值的上下文中使用时,仍然不会对其求值,取而代之的是它会被求值,任何非空字符串都会产生
真值

另一方面,会发生变量替换,即值
$(MyVar)
被值
MyVar
替换

内置变量在某种意义上似乎很特别,如果您
覆盖它们,那么这个过程会在开始时发生,它的值会立即被结果值替换

注意——这可能(也可能不)与


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

我考虑过这一点——这就是为什么我使用了
$[not(false)]
,它应该是一个变量。或者它必须是
$[非(假)]
?奇怪。。。我运行了一些测试(我将自定义变量
Build.Repository.Clean
设置为各种表达式),现在它总是
true
,不管该表达式是什么(
$[not(true)]
$[not(false)]
$[not]
$[invalid]
--所有结果都是
生成.Repository.Clean
)。看起来表达式根本没有计算@C.M.
$[not(false)]
这甚至不是一种支持格式。。。。。作为表达式的一部分,可以使用以下两种语法之一访问变量:索引语法:变量['MyVar']属性取消引用语法:
variables.MyVar
。我不确定你是如何测试的。但我也添加了一些测试和屏幕截图,让它更清晰。详细信息请参见我的更新答案。如果
$[not(false)]
不是一个有效的表达,那么这是非常误导的。对不起,我读了你的粗体段落(“你应该…”)几遍,我无法理解它。我应该为
Build.Repository.Clean
使用哪个表达式,以便在生成过程中它成为另一个变量(
QuickBuild
)的求反?我尝试了`$[not(eq(variables.QuickBuild,'true'))]--它不起作用