Heroku部署带Postgres的Ruby On Rails应用时资源预编译错误
核心报错(Sprockets link_tree 异常)修复方案
这个报错的直接原因是manifest.js中link_tree指定的目录不存在,按以下步骤排查:
- 首先查看你的
app/assets/config/manifest.js第一行的写法,默认应该是类似//= link_tree ../images、//= link_tree ../javascripts这类配置 - 检查你本地项目
app/assets/目录下,是否存在link_tree指向的对应文件夹:- 如果你写了
link_tree ../stylesheets但本地没有app/assets/stylesheets文件夹,或者文件夹是空的,Git不会提交空目录到仓库,Heroku部署时就会找不到目录触发报错 - 解决方案:如果是不需要的目录,直接删除manifest.js里对应的
link_tree行;如果是需要用到的目录,在目录下新建一个.keep空文件,提交到Git即可让空目录被仓库追踪
- 如果你写了
- 如果你使用了Rails 7+的importmaps/jsbundling等方案,原本的
app/assets/javascripts目录被移动到了app/javascript,需要把manifest.js里对应的link_tree ../javascripts修改为link_tree ../../../app/javascript,或者直接删除该行(如果你已经用js打包工具处理前端资源,不需要sprockets再管理js文件)
附带警告问题修复(避免后续部署隐患)
1. 多buildpack警告
你当前项目根目录同时存在Ruby和Node.js的标识文件(比如package.json和Gemfile同时存在),Heroku会默认按Ruby优先处理,但如果你的项目需要先编译前端资源,建议手动指定buildpack顺序:
在本地执行命令:
heroku buildpacks:add --index 1 heroku/nodejs heroku buildpacks:add --index 2 heroku/ruby
指定先运行Node.js buildpack打包前端资源,再运行Ruby buildpack处理Rails项目。
2. Ruby版本兼容警告
直接在项目的Gemfile里修改Ruby版本声明:
ruby "2.6.8"
重新在本地执行bundle install生成新的Gemfile.lock后提交即可,同时避免在Windows环境下生成lock文件提交,或者提交前执行bundle lock --add-platform x86_64-linux添加Linux平台适配,防止Heroku移除lock文件重新全量解析依赖。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

