为什么可以设置 TFS 预定义变量,据说它们是只读的?
Why one can set TFS predefined variables when they are said to be read-only?
根据https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=tfs-2018
These variables are automatically set by the system and read-only. (The exceptions are Build.Clean and System.Debug.)
尽管如此,如果有人尝试使用以下任务创建 vnext 构建
- 内联 Powershell -
Write-Host $env:BUILD_SOURCEVERSION
- 内联 Powershell -
Write-Host ("##vso[task.setvariable variable=build.sourceversion;]"+'someNewValue')
- 内联 Powershell -
Write-Host $env:BUILD_SOURCEVERSION
任务 2 不会失败,最后一个任务会输出类似
的内容
2018-10-24T07:37:23.1232438Z someNewValue
而不是预期的原始源版本(第一个任务中打印的值)。
所以,
- 要么我误读了文档/他们在那个帐户上不清楚
- 或者应该用 MS 来解决 TFS 中的某些真正缺陷?
这是预期的行为。
预定义变量由系统自动设置,只读。
However if you have defined a pipeline variable of the same name
as an environment variable (for example, PATH
), your pipeline variable
value overrides the agent host's environment variable.
因此,在您的场景中,您实际上定义了一个与预定义变量同名的新管道变量,但并未真正覆盖预定义变量。而且它们只能在管道中使用...
更新:
好吧,文档对 Environment Variables
有点误导,并且对它们的只读性提出了一些稍微矛盾的说法。实际上所有变量(*predefined、build、environment...)基本上都作为环境变量 mentioned here.
顺便说一句,您可以通过 get-childitem -path env:*
在管道中获取所有可用的环境变量。*
例如 PowerShell 脚本:
$environmentVars = get-childitem -path env:*
foreach($var in $environmentVars)
{
$keyname = $var.Key
$keyvalue = $var.Value
Write-Output "${keyname}: $keyvalue"
}
根据https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=tfs-2018
These variables are automatically set by the system and read-only. (The exceptions are Build.Clean and System.Debug.)
尽管如此,如果有人尝试使用以下任务创建 vnext 构建
- 内联 Powershell -
Write-Host $env:BUILD_SOURCEVERSION
- 内联 Powershell -
Write-Host ("##vso[task.setvariable variable=build.sourceversion;]"+'someNewValue')
- 内联 Powershell -
Write-Host $env:BUILD_SOURCEVERSION
任务 2 不会失败,最后一个任务会输出类似
的内容2018-10-24T07:37:23.1232438Z someNewValue
而不是预期的原始源版本(第一个任务中打印的值)。
所以,
- 要么我误读了文档/他们在那个帐户上不清楚
- 或者应该用 MS 来解决 TFS 中的某些真正缺陷?
这是预期的行为。
预定义变量由系统自动设置,只读。
However if you have defined a pipeline variable of the same name as an environment variable (for example,
PATH
), your pipeline variable value overrides the agent host's environment variable.
因此,在您的场景中,您实际上定义了一个与预定义变量同名的新管道变量,但并未真正覆盖预定义变量。而且它们只能在管道中使用...
更新:
好吧,文档对 Environment Variables
有点误导,并且对它们的只读性提出了一些稍微矛盾的说法。实际上所有变量(*predefined、build、environment...)基本上都作为环境变量 mentioned here.
顺便说一句,您可以通过 get-childitem -path env:*
在管道中获取所有可用的环境变量。*
例如 PowerShell 脚本:
$environmentVars = get-childitem -path env:*
foreach($var in $environmentVars)
{
$keyname = $var.Key
$keyvalue = $var.Value
Write-Output "${keyname}: $keyvalue"
}