(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'))]--它不起作用