求助:如何让Heroku为使用Workspaces的Yarn v3缓存依赖模块
我来帮你搞定这个缓存不生效的问题,结合你的配置和日志,有几个关键调整点:
1. 修正cacheDirectories配置,聚焦Yarn核心缓存目录
Yarn v3的依赖缓存核心目录是.yarn/cache,而你之前配置的各个packages/*/node_modules在Workspaces模式下其实是虚拟目录或者硬链接,不需要单独缓存。你可以把package.json里的cacheDirectories改成这样:
"engines": { "node": "16.x", "yarn": "3.x" }, "cacheDirectories": [ ".yarn/cache", "packages/web/.next/cache" ]
- 保留
.next/cache是因为这是Next.js的编译缓存,确实需要单独缓存 - 移除各个子包的
node_modules,因为Yarn v3会统一从.yarn/cache管理所有Workspaces的依赖
你之前添加.yarn/cache时提示目录为空,是因为第一次部署时这个目录还没生成,Heroku会跳过,但第二次部署时缓存生效后,这个目录就会被正确加载了。
2. 确保Yarn v3的版本激活正常
日志里Heroku提示“You don't need to specify Yarn engine”,但你在engines里指定yarn: 3.x是正确的——Heroku会先安装Yarn 1.x,再通过corepack激活项目指定的Yarn版本。为了确保corepack正常工作,你可以在package.json里加个前置脚本:
"scripts": { "preinstall": "corepack enable" }
这会让Heroku在安装依赖前开启corepack,保证用的是你项目里的Yarn 3.x版本。
3. 确认cache-native-yarn-cache配置生效
你已经设置了heroku-buildpack-features: cache-native-yarn-cache=true,这个配置是对的,它会告诉Heroku识别Yarn的原生缓存目录。只要上面的cacheDirectories包含了.yarn/cache,这个配置就能发挥作用。
4. 验证缓存效果
调整完配置后重新部署,重点看部署日志的这两部分:
- Restoring cache:应该会看到
.yarn/cache被加载,而不是提示“not cached - skipping” - Fetch step:如果缓存生效,大部分依赖会显示从缓存读取,不会再出现大量“can't be found in the cache”的提示
按照这些步骤调整后,就能让Heroku正确缓存Yarn v3 Workspaces的依赖,大幅缩短部署时间啦!
内容的提问来源于stack exchange,提问作者orbiteleven

