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

如何判断package.json包作用域并跳过GitHub Workflow步骤?

解决GitHub Workflow中根据包作用域跳过步骤的问题

错误原因分析

你之前的写法错误在于直接在GitHub Actions的if条件中使用shell命令(grep),但GitHub Actions的if字段采用GitHub表达式语法,而非直接执行shell命令,因此会触发解析错误。

修复方案

方法1:通过步骤输出判断包名是否带作用域

先添加一个步骤提取package.json中的包名,再通过该输出判断是否跳过后续步骤:

jobs:
  your-job-name:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      # 提取package.json中的包名并输出
      - name: 获取包名
        id: get-package-name
        run: |
          # 使用jq解析JSON(更可靠,Ubuntu默认预装)
          PKG_NAME=$(jq -r '.name' package.json)
          echo "name=$PKG_NAME" >> "$GITHUB_OUTPUT"

      # 需要跳过的步骤:仅当包名不带作用域时执行
      - name: 非作用域包专属步骤
        if: startsWith(steps.get-package-name.outputs.name, '@') == false
        run: |
          echo "执行仅针对非作用域包的操作"

如果环境中没有jq,可以用shell命令解析:

PKG_NAME=$(grep -o '"name": *"[^"]*"' package.json | cut -d'"' -f4)
echo "name=$PKG_NAME" >> "$GITHUB_OUTPUT"

方法2:在步骤内用shell条件判断

如果不需要完全跳过步骤,只是在包带作用域时不执行核心逻辑,可以直接在run命令中用shell条件:

- name: 可选执行的步骤
  run: |
    PKG_NAME=$(jq -r '.name' package.json)
    if [[ ! "$PKG_NAME" =~ ^@ ]]; then
      echo "执行非作用域包的操作"
      # 这里写你的核心命令
    fi

针对Turborepo多包仓库的适配

如果你的仓库是Turborepo monorepo,需要遍历packages目录下的每个包,可以结合循环处理:

- name: 检查所有包是否带作用域
  id: check-scoped-packages
  run: |
    # 遍历packages目录下的所有package.json
    for pkg in packages/*/package.json; do
      PKG_NAME=$(jq -r '.name' "$pkg")
      if [[ "$PKG_NAME" =~ ^@ ]]; then
        echo "scoped=true" >> "$GITHUB_OUTPUT"
        exit 0
      fi
    done
    echo "scoped=false" >> "$GITHUB_OUTPUT"

- name: 跳过作用域包时执行的步骤
  if: steps.check-scoped-packages.outputs.scoped == false
  run: echo "执行多包仓库下的非作用域包操作"

内容的提问来源于stack exchange,提问作者Mayank Kumar Chaudhari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 06:32:52