如何在GitHub Action中正确传递package.json版本作为环境变量?
解决GitHub Action中Chocolatey包版本传递失败问题
问题场景
我有一个GitHub Action工作流用于构建和发布Chocolatey包,工作流代码如下:
on: push jobs: test: runs-on: windows-2022 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache Tools uses: actions/cache@v3.0.11 with: path: tools key: ${{ runner.os }}-cache - name: Install Node.js uses: actions/setup-node@v4 with: node-version: 20.10.x - name: Choco pack run: choco pack task.nuspec - name: LS run: dir . - name: Set PACKAGE_VERSION id: version run: echo "PACKAGE_VERSION=$(node -p "require('./package.json').version")" >> "$GITHUB_OUTPUT" - name: Choco install env: PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }} run: choco install task.${{ steps.version.outputs.PACKAGE_VERSION }}.nupkg - name: Choco set api key env: CHOCOLATEY_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }} run: choco apikey --key $CHOCOLATEY_API_KEY --source https://push.chocolatey.org/ - name: Choco publish env: PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }} run: choco push task.${{ env.PACKAGE_VERSION }}.nupkg --source https://push.chocolatey.org/
执行时Choco install步骤报错,日志显示:
Run choco install task..nupkg Chocolatey v2.2.2 Package name cannot point directly to a local, or remote file. Please use the --source argument and point it to a local file directory, UNC directory path or a NuGet feed instead. Error: Process completed with exit code 1.
仓库根目录的package.json包含正确版本号:
{ "version": "0.0.2", ... }
本地执行node -p "require('./package.json').version"能正确返回0.0.2,但在Action中版本号未正确传递,生成了空版本号的task..nupkg。
尝试过的无效写法
我试了三种变量传递方式,均失败:
- 写法一:直接引用step输出,仍生成空版本号
- name: Choco install env: PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }} run: choco install task.${{ steps.version.outputs.PACKAGE_VERSION }}.nupkg - 写法二:直接使用环境变量,PowerShell未解析变量,字面执行命令
- name: Choco install env: PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }} run: choco install task.$PACKAGE_VERSION.nupkg - 写法三:引用env中的变量,仍生成空版本号
- name: Choco install env: PACKAGE_VERSION: ${{ steps.version.outputs.PACKAGE_VERSION }} run: choco install task.${{ env.PACKAGE_VERSION }}.nupkg
问题原因
- Shell兼容性问题:Windows runner默认使用PowerShell,原步骤中bash风格的
echo >> $GITHUB_OUTPUT写法无法在PowerShell中正确写入输出变量,导致steps.version.outputs.PACKAGE_VERSION为空。 - Chocolatey命令用法错误:Chocolatey不允许在
install命令后直接指定本地nupkg文件路径,必须通过--source参数指向本地目录。
解决方案
方案一:修正版本号输出(适配PowerShell)
将Set PACKAGE_VERSION步骤改为PowerShell兼容写法,同时修正Choco install的命令格式:
- name: Set PACKAGE_VERSION id: version shell: pwsh run: | $version = node -p "require('./package.json').version" Write-Output "PACKAGE_VERSION=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 - name: Choco install run: | choco install task --version ${{ steps.version.outputs.PACKAGE_VERSION }} --source .
方案二:直接从nuspec读取版本(无需Node.js)
如果task.nuspec中已定义版本,可直接用Chocolatey命令提取,省去Node.js依赖:
- name: Set PACKAGE_VERSION id: version shell: pwsh run: | $version = choco pack task.nuspec --output-directory . --what-if | Select-String -Pattern "Creating package '.*\.(\d+\.\d+\.\d+)\.nupkg'" | ForEach-Object { $_.Matches.Groups[1].Value } Write-Output "PACKAGE_VERSION=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 # 后续install和push步骤调整为正确格式 - name: Choco install run: choco install task --version ${{ steps.version.outputs.PACKAGE_VERSION }} --source . - name: Choco publish run: choco push task.${{ steps.version.outputs.PACKAGE_VERSION }}.nupkg --source https://push.chocolatey.org/
修改后的完整工作流示例
on: push jobs: test: runs-on: windows-2022 steps: - name: Checkout uses: actions/checkout@v3 - name: Cache Tools uses: actions/cache@v3.0.11 with: path: tools key: ${{ runner.os }}-cache - name: Install Node.js(从package.json取版本时保留) uses: actions/setup-node@v4 with: node-version: 20.10.x - name: Choco pack run: choco pack task.nuspec - name: Set PACKAGE_VERSION id: version shell: pwsh run: | $version = node -p "require('./package.json').version" Write-Output "PACKAGE_VERSION=$version" | Out-File -FilePath $env:GITHUB_OUTPUT -Append -Encoding utf8 - name: Choco install run: choco install task --version ${{ steps.version.outputs.PACKAGE_VERSION }} --source . - name: Choco set api key env: CHOCOLATEY_API_KEY: ${{ secrets.CHOCOLATEY_API_KEY }} run: choco apikey --key $CHOCOLATEY_API_KEY --source https://push.chocolatey.org/ - name: Choco publish run: choco push task.${{ steps.version.outputs.PACKAGE_VERSION }}.nupkg --source https://push.chocolatey.org/
关键说明
- Windows runner中需注意shell差异,建议显式指定
shell: pwsh避免歧义,PowerShell的输出和文件操作逻辑与bash不同。 - Chocolatey安装本地包的正确用法是指定包名+版本+本地目录源,而非直接指定nupkg文件路径。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

