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

custom variable (of a TFS build) can't be populated with expression

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

奇怪的是,用 $(FullBuild) 之类的东西定义它(其中 FullBuild 是另一个自定义变量)工作得很好。

我是不是漏掉了什么?

备注:

背景故事:

尝试根据自定义变量 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。无论您在队列构建期间在 FullBuildBuild.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 有关。

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