部署KotlinJS React Web应用至Heroku时遭遇tar内容提取失败错误
看起来你在部署带有Web应用模块、Shared模块,且包含自行修改库的Kotlin Multiplatform项目到Heroku时,碰到了caniuse-lite包提取失败的问题——本地运行kotlinNpmInstall完全正常,但Heroku上构建就报错说文件损坏或缺失。下面是几个经过验证的解决方案,你可以按顺序尝试:
1. 先清掉Heroku的构建缓存
Heroku会缓存依赖包来加速构建,但有时候缓存里的文件会损坏。直接清理缓存就能让它重新下载所有依赖:
heroku builds:cache:purge
清理完之后重新推送代码部署,看看问题是否消失。
2. 强制指定caniuse-lite的稳定版本
报错的caniuse-lite@1.0.30001269这个版本可能在Yarn的源上存在损坏的包。你可以在项目(尤其是Web模块)的package.json里添加resolutions字段,强制使用更新更稳定的版本:
"resolutions": { "caniuse-lite": "^1.0.30001500" }
选一个比报错版本新的就行,比如上面的1.0.30001500。然后本地运行yarn install生成新的yarn.lock,把这个锁文件一起提交到Git,再推送到Heroku。
3. 对齐本地和Heroku的Node/Yarn版本
本地和Heroku使用的Node或Yarn版本不一致,也可能导致依赖解析时出现奇怪的问题。你可以在项目根目录创建.node-version文件,写上你本地用的Node版本:
18.17.0
或者在package.json里添加engines字段,同时指定Node和Yarn的版本范围:
"engines": { "node": "18.x", "yarn": "1.22.x" }
这样Heroku就会使用和你本地一致的环境来构建,减少兼容性问题。
4. 检查自定义修改库的依赖配置
因为你用了自己修改后的库,要确认这个库的Gradle配置里有没有引入不稳定的npm依赖,或者有没有遗漏提交相关的锁文件。确保自定义库的依赖版本都是稳定的,并且所有必要的配置文件都已经提交到版本控制里。
为什么本地没问题Heroku会报错?
大概率是Heroku的缓存保留了损坏的caniuse-lite包,或者依赖源在服务器端的文件有问题。另外,环境版本不匹配也会导致依赖安装时的文件提取逻辑出现差异,本地能正常处理的文件,在Heroku的环境里就出问题了。
内容的提问来源于stack exchange,提问作者Nikola-Milovic

