Azure Pipelines发布管道中无法持久化npm任务输出的技术问询
解决Azure Pipelines中Npm任务输出无法持久化的问题
你遇到的核心问题是:Npm@1任务的customCommand参数会把所有内容直接传递给npm命令,管道的重定向符号(比如>)会被当成npm的参数而非shell命令,所以不会执行文件写入操作。不用手动配置.npmrc,有两种简单的方式可以实现版本号的持久化:
方法1:利用Npm任务输出设置管道变量
给Npm任务添加一个名称,然后用后续的PowerShell/Bash步骤捕获它的输出并设置为管道变量,这样后续所有步骤都能直接引用:
- task: Npm@1 displayName: 'Get current published beta-version' name: GetBetaVersion # 给任务命名,用于后续引用输出 inputs: command: custom workingDir: ./packages/package verbose: false customCommand: 'show somepackagename@beta version' customRegistry: useFeed customFeed: '<someguids>' - task: PowerShell@2 displayName: 'Capture beta version as pipeline variable' inputs: targetType: 'inline' script: | # 获取Npm任务的标准输出,清理多余空格 $betaVersion = $(GetBetaVersion.Outputs.stdout).Trim() # 设置为全局管道变量,后续步骤用$(BetaVersion)即可引用 Write-Host "##vso[task.setvariable variable=BetaVersion;]$betaVersion"
这个方法的好处是保留了Npm任务的自动认证逻辑,不需要额外处理私有feed的访问权限。
方法2:用Shell脚本步骤直接执行npm命令并保存输出
如果更倾向于将版本号写入文件,可以直接用Bash或PowerShell步骤执行npm命令,此时重定向符号会被shell正确解析。Azure Pipelines会自动为私有feed配置好npm认证,无需手动修改.npmrc:
Bash示例:
- task: Bash@3 displayName: 'Get beta version and save to file' inputs: targetType: 'inline' workingDirectory: ./packages/package script: | # 执行npm命令并将输出写入文件 npm show somepackagename@beta version > version.txt # 同时设置管道变量供后续步骤使用 BETA_VERSION=$(cat version.txt) echo "##vso[task.setvariable variable=BetaVersion;]$BETA_VERSION"
PowerShell示例:
- task: PowerShell@2 displayName: 'Get beta version and save to file' inputs: targetType: 'inline' workingDirectory: ./packages/package script: | npm show somepackagename@beta version | Out-File -FilePath version.txt -Encoding utf8 $betaVersion = Get-Content version.txt -Raw | Trim Write-Host "##vso[task.setvariable variable=BetaVersion;]$betaVersion"
为什么之前的重定向不生效?
Npm@1任务的customCommand是作为参数直接传递给npm可执行文件的,比如你输入show somepackagename@beta version > version.txt,npm会把> version.txt当成show命令的额外参数,而非交给操作系统shell处理重定向,所以不会生成文件。只有在shell脚本环境中,重定向符号才会被正确解析。
内容的提问来源于stack exchange,提问作者andMarkus
相关产品推荐
相关产品推荐

