You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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
    

问题原因

  1. Shell兼容性问题:Windows runner默认使用PowerShell,原步骤中bash风格的echo >> $GITHUB_OUTPUT写法无法在PowerShell中正确写入输出变量,导致steps.version.outputs.PACKAGE_VERSION为空。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:37:46