пользовательская переменная (из сборки TFS) не может быть заполнена выражением - PullRequest
0 голосов
/ 26 февраля 2020

В определении сборки (на вкладке Переменные) я пытаюсь определить пользовательскую переменную (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 голосов
/ 05 марта 2020

Выражения не оцениваются, когда они используются для инициализации пользовательских переменных (на вкладке Variables). Т.е. значение переменной заканчивается как string со значением, равным вашему выражению (например, '$[not(<whatever>)]'). Позже, когда эта переменная используется в контексте, который ожидает boolean - она ​​все равно не оценивается, вместо этого она получает приведение типа и любая непустая строка дает true.

С другой стороны происходит подстановка переменной - т.е. значение $(MyVar) заменяется значением MyVar.

Встроенная переменная кажется особенной в том смысле, что если Вы override их - этот процесс происходит в начале, и его значение немедленно заменяется полученным значением.

Примечание - это может (или не может) быть связано с this .

Итог: вы не можете использовать выражения для переопределения значения встроенной переменной.

0 голосов
/ 27 февраля 2020

Обновление 3:

Хорошо, игнорируйте, если это изменит чистую операцию во время очереди. Для того, что вы ищете, вы можете попробовать этот формат:

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

  • Если QuickBuild=True, Build.Repository.Clean=False,
  • Если QuickBuild=False , тогда Build.Repository.Clean.Clean=True

Например:

Я установил опцию clean в Get Source Step, Clean = true

Build.Repository.Clean=$(FullBuild)

FullBuild=false

enter image description here

enter image description here

Теперь, когда я ставлю в очередь сборку, попробуйте изменить FullBuild=false во время очереди.

Как вы думаете, Build.Repository.Clean должен измениться на False, тогда операция очистки не будет выполнена. Но правда в том, что Build.Repository.Clean по-прежнему True, и очистка выполняется.

enter image description here

Даже вы делаете не обновлять значение FullBuild=false в течение времени очереди, непосредственно установить значение FullBuild=false в конвейере сборки. Это также не будет использовать.

Напротив, если вы установили Clean = false в Get Source Step. Независимо от того, какое значение вы вводите в FullBuild или Build.Repostiory.Clean во время построения очереди.

Оно не будет очищаться во время конвейера сборки.

enter image description here

Вывод: невозможно изменить операцию очистки во время очереди. Это никак не связано ни с одним выражением. Неважно, какое значение вы установите для Build.Repository.Clean.


Обновление 2

После go через ваш вопрос и все комментарии еще раз. Кажется, ваша истинная цель - назначить чистые параметры во время очереди на основе другой настраиваемой переменной .

enter image description here

Поскольку вы не можете изменить Build.Repository.Clean во время очереди. Итак, вы пытаетесь использовать этот обходной путь. Это не поддержка. Невозможно назначить параметры очистки в очереди .

Возможно, вам придется предварительно определить эту переменную в конвейере сборки.

Также взгляните на этот вопрос: Как очистить сборку с помощью автономного агента при постановке в очередь

В вашем сценарии вы можете создать два конвейера сборки как безобразный обходной путь. Один для инкрементной сборки ( Отключите опцию Очистить на шаге получения источника или используйте переменную Build.Repository.Clean = False), а другой включите опцию Очистить.

Надеюсь, это ясно.

...