Почему можно устанавливать предопределенные переменные TFS, когда они называются только для чтения? - PullRequest
0 голосов
/ 24 октября 2018

Согласно https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=tfs-2018

Эти переменные автоматически устанавливаются системой и доступны только для чтения.(Исключением являются Build.Clean и System.Debug.)

Тем не менее, если попытаться создать сборку vnext со следующими задачами

  1. Inline Powershell - Write-Host $env:BUILD_SOURCEVERSION
  2. Встроенный Powershell - Write-Host ("##vso[task.setvariable variable=build.sourceversion;]"+'someNewValue')
  3. Встроенный Powershell - Write-Host $env:BUILD_SOURCEVERSION

Задача 2 не будет выполнена, и последняя задача выдаст что-то вроде

2018-10-24T07: 37: 23.1232438Z someNewValue

вместо ожидаемой исходной версии источника (значение, напечатанное в первой задаче).

Итак,

  1. Либо я неправильно читаю документы / они неясны в этом отношении
  2. Или это какой-то подлинный дефект в TFS, который следует искать с MS?

1 Ответ

0 голосов
/ 25 октября 2018

Это ожидаемое поведение.

Предопределенные переменные автоматически устанавливаются системой и доступны только для чтения.

Однако если вы определили переменную конвейера с тем же именем в качестве переменной среды (например, PATH), значение вашей конвейерной переменной переопределяет переменную среды хоста агента.

Подробнее см. Переменные среды .

Итак, в вашем сценарии вы фактически определили новую переменную конвейера с тем же именем, что и у предварительно определенного, но на самом деле не перезаписать предопределенную переменную.И они могут использоваться только в конвейерах ...


ОБНОВЛЕНИЕ:

Ну, документация несколько вводит в заблуждение относительно Environment Variables и делает некоторыеСлегка противоречивые утверждения об их читабельности.Фактически все переменные (* предопределенные, сборка, окружение ...) в основном работают как переменные окружения , упомянутые здесь .

Кстати, вы можете получить все доступные переменные окружения с помощью get-childitem -path env:* вконвейер. *

Сценарий PowerShell, например:

$environmentVars = get-childitem -path env:*
foreach($var in $environmentVars)
{
 $keyname = $var.Key
 $keyvalue = $var.Value

 Write-Output "${keyname}: $keyvalue"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...