如何判断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
相关产品推荐
相关产品推荐

