如何在NX Monorepo中获取受影响项目的路径?
解决NX Monorepo中获取受影响项目路径用于GitHub Actions的方案
核心思路
直接利用NX的print-affected命令提取受影响项目的根路径(即项目在Monorepo中的实际目录),无需依赖标签或手动拼接路径,完全适配嵌套目录结构。
具体实现步骤
1. 用NX命令提取受影响项目的路径
使用nx print-affected结合自定义格式,直接输出所有受影响项目的路径列表:
nx print-affected --type=project --plain --format='{projects: [join(",", projects.nodes.*.data.root)]}'
--type=project:仅筛选项目(排除库等其他类型)--plain:输出纯文本格式,避免额外的日志信息--format:通过NX内置模板语法,提取每个项目的root字段(即项目实际目录路径),并以逗号分隔
执行后会得到类似输出:
apps/go/api-gateway,apps/node/user-service,libs/shared/utils
2. 在GitHub Actions中处理为矩阵变量
将命令结果转换成JSON数组,设置为GitHub Actions输出变量,供后续矩阵使用:
jobs: get-affected-projects: runs-on: ubuntu-latest outputs: project-paths: ${{ steps.extract-paths.outputs.paths }} steps: - uses: actions/checkout@v4 - uses: nrwl/nx-set-shas@v4 - name: Extract affected project paths id: extract-paths run: | PATHS=$(nx print-affected --type=project --plain --format='{projects: [join(",", projects.nodes.*.data.root)]}') # 转换为JSON数组格式 JSON_PATHS=$(echo "[\"${PATHS//,/\",\"}\"]") echo "paths=$JSON_PATHS" >> $GITHUB_OUTPUT run-workflows: needs: get-affected-projects runs-on: ubuntu-latest strategy: matrix: project-path: ${{ fromJson(needs.get-affected-projects.outputs.project-paths) }} steps: - uses: actions/checkout@v4 - name: Run workflow for ${{ matrix.project-path }} # 根据项目路径判断语言,复用对应工作流逻辑 run: | if [[ ${{ matrix.project-path }} == apps/go/* ]]; then # 执行Go项目的构建/测试逻辑 cd ${{ matrix.project-path }} go build ./... go test ./... elif [[ ${{ matrix.project-path }} == apps/node/* ]]; then # 执行Node.js项目的构建/测试逻辑 cd ${{ matrix.project-path }} npm install npm run build npm run test fi
方案优势
- 健壮性:直接读取NX项目元数据中的
root字段,目录移动或项目重命名时,NX会自动维护该字段,无需手动同步标签或路径配置 - 通用性:适配任意目录结构(无论是否嵌套),无需修改命令逻辑
- 无缝复用工作流:将路径作为矩阵变量传递后,可根据路径前缀判断项目类型,复用现有语言专属的工作流逻辑
内容的提问来源于stack exchange,提问作者Raoul
相关产品推荐
相关产品推荐

