GitHub Actions中npm version与package-lock.json缓存问题咨询
解决npm version触发时GitHub Actions缓存失效的问题
你的核心问题在于npm version prerelease会修改package-lock.json中的版本字段,导致缓存key的哈希值每次都变化,无法命中缓存。以下是两种可行的解决方案,无需放弃npm version的使用:
方案一:过滤锁文件的版本字段后生成哈希
npm version仅修改版本号,不会改变依赖的实际内容(比如包的完整性哈希)。我们可以先过滤掉package-lock.json中所有版本相关的字段,再基于过滤后的文件生成缓存key,这样只要依赖未变更,就能命中缓存。
修改工作流,添加一个生成无版本锁文件的步骤,再调整缓存key:
- uses: actions/checkout@v2 - name: Generate lockfile without version fields run: | # 过滤掉package-lock.json中的版本相关字段 jq 'del(.version, .packages[""].version, .packages[""]._version)' package-lock.json > package-lock-no-version.json - name: Cache node modules id: cache-nodemodules uses: actions/cache@v2 env: cache-name: cache-node-modules-preview with: path: node_modules # 基于过滤后的锁文件生成缓存key key: ${{ runner.os }}-preview-${{ env.cache-name }}-${{ hashFiles('**/package-lock-no-version.json') }} restore-keys: | ${{ runner.os }}-preview-${{ env.cache-name }}- ${{ runner.os }}-preview- - name: Install Dependencies app if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci --legacy-peer-deps - name: build run: npm run build
方案二:基于依赖完整性哈希生成缓存key
另一种更精准的方式是提取package-lock.json中决定依赖安装内容的核心字段——所有依赖的integrity值和锁文件版本,基于这些生成哈希,完全规避版本号变更的影响:
- uses: actions/checkout@v2 - name: Generate dependency integrity hash run: | # 提取锁文件版本和所有依赖的完整性哈希,排序后生成唯一值 jq '[.lockfileVersion] + [.packages[].integrity] | sort | @sha256' package-lock.json > dependency-integrity-hash.txt - name: Cache node modules id: cache-nodemodules uses: actions/cache@v2 env: cache-name: cache-node-modules-preview with: path: node_modules key: ${{ runner.os }}-preview-${{ env.cache-name }}-${{ hashFiles('dependency-integrity-hash.txt') }} restore-keys: | ${{ runner.os }}-preview-${{ env.cache-name }}- ${{ runner.os }}-preview- - name: Install Dependencies app if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci --legacy-peer-deps - name: build run: npm run build
注意事项
- GitHub Actions的Ubuntu默认runner已预装
jq工具,无需额外安装;若使用其他系统runner,需先安装jq。 - 两种方案的核心逻辑都是剥离版本号对缓存key的影响,只基于实际依赖内容生成哈希,确保依赖未变更时缓存能正常命中。
内容的提问来源于stack exchange,提问作者yuksi
相关产品推荐
相关产品推荐

