Azure Pipeline中使用变量配置npm预发布版本报错,能否解决?
Azure Pipeline npm version命令执行失败问题
配置的YAML脚本
name: $(Build.BuildId)-${{ variables['Build.SourceBranchName']}} - ${{ if not(or(eq(variables['Build.SourceBranchName'], 'master'), eq(variables['Build.SourceBranchName'], 'main'))) }}: - task: Npm@1 displayName: 'npm version' inputs: workingDir: '$(Build.SourcesDirectory)/Thingamajig' command: custom customCommand: version prerelease --preid=$(name)
执行错误信息
npm verb stack Error: Invalid version: "0.0.1-$(name).0"
问题解答
当前配置能否正常工作?
不能。原因是Azure Pipeline的运行时变量语法$(name)无法在npm的customCommand中被正确解析,npm会直接把$(name)当作字符串字面量使用,生成了不符合语义化版本规范的无效版本号。
解决方法
方法1:使用模板表达式引用变量
name是Pipeline编译阶段定义的变量,改用模板表达式${{ variables.name }}引用,在编译阶段就会替换为实际值:
- ${{ if not(or(eq(variables['Build.SourceBranchName'], 'master'), eq(variables['Build.SourceBranchName'], 'main'))) }}: - task: Npm@1 displayName: 'npm version' inputs: workingDir: '$(Build.SourcesDirectory)/Thingamajig' command: custom customCommand: version prerelease --preid=${{ variables.name }}
方法2:通过任务传递运行时变量
如果需要使用运行时变量,先将name的值存入Pipeline运行时变量,再在npm命令中引用:
- ${{ if not(or(eq(variables['Build.SourceBranchName'], 'master'), eq(variables['Build.SourceBranchName'], 'main'))) }}: - task: PowerShell@2 displayName: 'Set version preid variable' inputs: targetType: 'inline' script: | Write-Host "##vso[task.setvariable variable=versionPreid]$(name)" - task: Npm@1 displayName: 'npm version' inputs: workingDir: '$(Build.SourcesDirectory)/Thingamajig' command: custom customCommand: version prerelease --preid=$(versionPreid)
额外注意
npm预发布版本的--preid参数值仅允许包含字母、数字和连字符,需确保name变量的内容符合该规则,避免再次触发无效版本号错误。
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

