Azure devops lower()函数在Azure DevOps YAML管道中似乎不起作用

Azure devops lower()函数在Azure DevOps YAML管道中似乎不起作用,azure-devops,azure-pipelines-yaml,Azure Devops,Azure Pipelines Yaml,我试图在YAML模板中使用lower()函数,但不了解其行为。 我有一个名为Infra.Environment.ShortName的变量组,其值为“Dev”。 在我的YAML模板中,我从变量组中定义了一个变量: variables: - name: environmentShortName value: $(Infra.Environment.ShortName) 在任务中,我引用此变量: - task: AzureResourceGroupDeployment@2 dis

我试图在YAML模板中使用lower()函数,但不了解其行为。 我有一个名为Infra.Environment.ShortName的变量组,其值为“Dev”。 在我的YAML模板中,我从变量组中定义了一个变量:

  variables:
  - name: environmentShortName
    value: $(Infra.Environment.ShortName)
在任务中,我引用此变量:

- task: AzureResourceGroupDeployment@2
  displayName: 'Deploy Storage Account'
  inputs:
    azureSubscription: ${{ parameters.subscription }}
    resourceGroupName: mst-${{ lower(variables.environmentShortName) }}-infra
    location: '$(Infra.Environment.Region.Primary)'
    csmFile: '$(Pipeline.Workspace)/$(Build.DefinitionName)/Resources/infra-storageAccount.json'
    csmParametersFile: '$(Pipeline.Workspace)/$(Build.DefinitionName)/Resources/infra-storageAccount.parameters.json'
    deploymentOutputs: ArmOutputs
我尝试过不同的表达式,但不理解为什么不能将变量组值转换为小写:

resourceGroupName: mst-${{ lower(variables.environmentShortName) }}-infra
=>mst开发基础设施(下部似乎不起作用)

=>mst Dev infra(格式有效,但较低版本无效)

=>$[format('mst-{0}-infra',lower(variables.environmentShortName))](未计算表达式)

=>mst--infra(空值)


=>mst dev infra(lower使用常量值)

以下代码段将正常工作,并将“mst test infra”作为输出:

变量:
环境短名称:测试
步骤:
-powershell:写入主机“${format('mst-{0}-infra',lower(variables.environmentShortName))}”
这是因为变量设置为literal值,并且该值在编译时是已知的

如果environmentShortName的值依赖于另一个变量,如:

environmentShortName: $(System.TeamProject)
lower()将无法正常工作,其行为与您描述的一样。 这里有(我的)逻辑解释:表达式
${{{variables.environmentShortName}}
在编译时解析,可能您的变量值还没有准备好解析

处理这种行为时,请考虑更改< <代码>下拉()>代码>的位置,并将其移到变量声明部分:

变量:
environmentShortName:${lower(变量['System.TeamProject'])}
步骤:
-powershell:写入主机“mst-$(environmentShortName)-infra”

解决方案是使用运行时变量,因为变量组在编译时未解析。运行时表达式有一些限制,但以下方法可行:

  - name: environmentShortName
    value: $[lower(variables['Infra.Environment.ShortName'])]

    resourceGroupName: mst-$(environmentShortName)-infra

感谢Alexander,在我的例子中不起作用,因为变量来自变量组,并且不是预定义的变量。但是你的建议帮助我找到了解决方案。很好,也许将你的发现作为答案发布是有意义的,这样其他具有类似情况的人将重新使用你的修复。
resourceGroupName: mst-${{ lower(variables['Infra.Environment.ShortName']) }}-infra
resourceGroupName: mst-${{ lower('Dev') }}-infra
environmentShortName: $(System.TeamProject)
  - name: environmentShortName
    value: $[lower(variables['Infra.Environment.ShortName'])]

    resourceGroupName: mst-$(environmentShortName)-infra