为什么可以设置 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 构建

  1. 内联 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. 或者应该用 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

因此,在您的场景中,您实际上定义了一个与预定义变量同名的新管道变量,但并未真正覆盖预定义变量。而且它们只能在管道中使用...


更新:

好吧,文档对 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"
}