问题背景
在使用GitHub Actions部署多项目仓库时,经常会遇到这样的错误:
Error: Dependencies lock file is not found in /home/runner/work/project/project.
Supported file patterns: package-lock.json,npm-shrinkwrap.json,yarn.lock
这是因为GitHub Actions的actions/setup-node
默认只在仓库根目录查找依赖锁定文件,而在多项目结构中,每个子项目都有自己的package-lock.json。
解决方案
解决方法是为每个子项目正确配置cache-dependency-path
参数,指向对应的package-lock.json文件。
- name: 设置项目Node.js缓存
uses: actions/setup-node@v3
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: './subdir/package-lock.json'
完整示例
以下是针对多项目仓库的配置示例:
# 处理项目A
- name: 检查是否需要部署项目A
id: check_project_a
run: |
COMMIT_MSG=$(git log -1 --pretty=%B)
if [[ "$COMMIT_MSG" == *"projectA"* ]]; then
echo "DEPLOY=true" >> $GITHUB_OUTPUT
else
echo "DEPLOY=false" >> $GITHUB_OUTPUT
fi
- name: 设置项目A的Node.js缓存
if: steps.check_project_a.outputs.DEPLOY == 'true'
uses: actions/setup-node@v3
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: './projectA/package-lock.json'
- name: 安装项目A依赖
if: steps.check_project_a.outputs.DEPLOY == 'true'
working-directory: ./projectA
run: npm ci
小结
通过正确配置cache-dependency-path
参数,可以:
- 为每个子项目单独设置依赖缓存
- 加速构建流程,减少依赖安装时间
- 提高CI/CD流程的稳定性
在多项目仓库中,应该为每个需要构建的子项目单独配置Node.js环境和缓存路径,而不是使用全局缓存设置。