自定义变量(TFS 构建)不能用表达式填充
custom variable (of a TFS build) can't be populated with expression
在构建定义中(在“变量”选项卡上),我尝试使用简单表达式 $[not(false)]
定义自定义变量 (Build.Repository.Clean
)。但是当我在构建过程中打印变量时——无论使用什么表达式,Build.Repository.Clean
值总是 false
.
奇怪的是,用 $(FullBuild)
之类的东西定义它(其中 FullBuild
是另一个自定义变量)工作得很好。
我是不是漏掉了什么?
备注:
- 使用 TFS 2018
背景故事:
尝试根据自定义变量 QuickBuild
设置 Build.Repository.Clean
变量(可以在启动构建时由用户设置)。尝试指定 $[not(variables.QuickBuild)]
(以及相同表达式的其他变体)——运气不好。
这是它现在的工作方式(但我宁愿使用 QuickBuild
而不是 FullBuild
—— 只是不知道如何取反变量):
更新 3:
好吧,如果它在排队时间改变清洁操作,请忽略。对于您正在寻找的内容,您可以尝试这种格式:
Build.Repository.Clean=$[not(eq(variables.QuickBuild,'True'))]
- 如果
QuickBuild=True
,Build.Repository.Clean=False
,
- 如果
QuickBuild=False
,则Build.Repository.Clean.Clean=True
例如:
我在 Get Source Step 中设置了 clean 选项,Clean=true
Build.Repository.Clean=$(FullBuild)
FullBuild=false
现在,当我对构建进行排队时,然后尝试在排队期间更改 FullBuild=false
时间.
如你所想,Build.Repository.Clean应该改为False,那么clean操作就不会执行了。 但事实是,Build.Repository.Clean 仍然是 True 并且执行了清理。
即使你在队列时间不更新FullBuild=false
的值,直接在构建管道中设置值FullBuild=false
。这个也不会用。
反之,如果在Get Source Step中设置Clean=false。无论您在队列构建期间在 FullBuild
或 Build.Repostiory.Clean
中输入什么样的值。
它不会在构建管道期间清理。
结论:无法更改排队时间的clean操作。这根本与任何表达式无关。不管你为 Build.Repository.Clean
设置什么样的值。
更新 2
再次检查您的问题和所有评论后。看来您的真正目标是根据另一个自定义变量 在排队时分配清理选项。
因为您无法在排队期间更改 Build.Repository.Clean
。所以您正在尝试使用此解决方法。这不是支持。 无法在排队时分配清理选项。
您可能必须在构建管道中预先定义此变量。
也看看这个问题:
在您的场景中,您可以创建两个构建管道作为一种丑陋的解决方法。一个用于增量构建(Disable the Clean option 在获取源步骤中,或使用变量 Build.Repository.Clean
= False),另一个启用清理选项。
希望清楚。
Expressions are not evaluated when they are used to initialize custom variables (on Variables
tab). I.e. variable value ends up being a string
with value equal to your expression (e.g. '$[not(<whatever>)]'
). Later, when that variable gets used in context that expect boolean
-- it still doesn't get evaluated, instead it gets type-casted 和任何非空字符串产生 true
.
另一方面 变量替换 发生了——即值 $(MyVar)
被替换为 MyVar
.
的值
内置变量似乎在某种意义上是特殊的,如果你 override
他们——这个过程发生在开始时,它的值立即被结果值替换。
注意 -- 这可能(或可能不)与 this 有关。
底线:您不能使用表达式来覆盖内置变量的值。
在构建定义中(在“变量”选项卡上),我尝试使用简单表达式 $[not(false)]
定义自定义变量 (Build.Repository.Clean
)。但是当我在构建过程中打印变量时——无论使用什么表达式,Build.Repository.Clean
值总是 false
.
奇怪的是,用 $(FullBuild)
之类的东西定义它(其中 FullBuild
是另一个自定义变量)工作得很好。
我是不是漏掉了什么?
备注:
- 使用 TFS 2018
背景故事:
尝试根据自定义变量 QuickBuild
设置 Build.Repository.Clean
变量(可以在启动构建时由用户设置)。尝试指定 $[not(variables.QuickBuild)]
(以及相同表达式的其他变体)——运气不好。
这是它现在的工作方式(但我宁愿使用 QuickBuild
而不是 FullBuild
—— 只是不知道如何取反变量):
更新 3:
好吧,如果它在排队时间改变清洁操作,请忽略。对于您正在寻找的内容,您可以尝试这种格式:
Build.Repository.Clean=$[not(eq(variables.QuickBuild,'True'))]
- 如果
QuickBuild=True
,Build.Repository.Clean=False
, - 如果
QuickBuild=False
,则Build.Repository.Clean.Clean=True
例如:
我在 Get Source Step 中设置了 clean 选项,Clean=true
Build.Repository.Clean=$(FullBuild)
FullBuild=false
现在,当我对构建进行排队时,然后尝试在排队期间更改 FullBuild=false
时间.
如你所想,Build.Repository.Clean应该改为False,那么clean操作就不会执行了。 但事实是,Build.Repository.Clean 仍然是 True 并且执行了清理。
即使你在队列时间不更新FullBuild=false
的值,直接在构建管道中设置值FullBuild=false
。这个也不会用。
反之,如果在Get Source Step中设置Clean=false。无论您在队列构建期间在 FullBuild
或 Build.Repostiory.Clean
中输入什么样的值。
它不会在构建管道期间清理。
结论:无法更改排队时间的clean操作。这根本与任何表达式无关。不管你为 Build.Repository.Clean
设置什么样的值。
更新 2
再次检查您的问题和所有评论后。看来您的真正目标是根据另一个自定义变量 在排队时分配清理选项。
因为您无法在排队期间更改 Build.Repository.Clean
。所以您正在尝试使用此解决方法。这不是支持。 无法在排队时分配清理选项。
您可能必须在构建管道中预先定义此变量。
也看看这个问题:
在您的场景中,您可以创建两个构建管道作为一种丑陋的解决方法。一个用于增量构建(Disable the Clean option 在获取源步骤中,或使用变量 Build.Repository.Clean
= False),另一个启用清理选项。
希望清楚。
Expressions are not evaluated when they are used to initialize custom variables (on Variables
tab). I.e. variable value ends up being a string
with value equal to your expression (e.g. '$[not(<whatever>)]'
). Later, when that variable gets used in context that expect boolean
-- it still doesn't get evaluated, instead it gets type-casted 和任何非空字符串产生 true
.
另一方面 变量替换 发生了——即值 $(MyVar)
被替换为 MyVar
.
内置变量似乎在某种意义上是特殊的,如果你 override
他们——这个过程发生在开始时,它的值立即被结果值替换。
注意 -- 这可能(或可能不)与 this 有关。
底线:您不能使用表达式来覆盖内置变量的值。