Rails项目部署Heroku时执行rake assets:precompile报错求助
rake assets:precompile的ActiveRecord连接错误 这种情况我帮不少开发者排查过,本质原因是Heroku的构建逻辑和Rails资产预编译的默认行为冲突了:当你执行rake assets:precompile(Rails 5.1+也可以用rails assets:precompile)时,默认会加载整个Rails运行环境,而这一步会触发ActiveRecord尝试建立数据库连接。但Heroku的构建阶段(build phase)是没有数据库访问权限的——此时数据库还没完成初始化,自然会抛出你看到的connection_specification.rb连接错误。
下面分两种场景给你解决方案:
场景1:你的资产预编译不需要数据库(绝大多数简单项目都是这种情况)
这是最常见的情况,只需要修改Rails配置,让预编译时跳过ActiveRecord的初始化:
打开你的
config/application.rb文件,添加这一行配置:config.assets.initialize_on_precompile = false这行代码会告诉Rails,在预编译静态资产时,不要初始化ActiveRecord和整个应用环境,只加载资产相关的逻辑。
提交修改并重新部署到Heroku:
git add config/application.rb git commit -m "Skip ActiveRecord init during asset precompile" git push heroku master
场景2:你的资产预编译依赖数据库(比如动态生成的样式/脚本)
如果你的资产需要读取数据库数据(比如根据DB里的配置生成主题样式),那上面的方法就不适用了,得调整部署流程,让资产预编译在数据库可用之后执行:
修改项目根目录的
Procfile,添加一个release阶段的任务,把数据库迁移和资产预编译放在一起:release: rake db:migrate assets:precompile web: rails serverHeroku会在部署的release阶段先执行数据库迁移,此时数据库已经可用,再执行资产预编译就不会出现连接错误了。
提交
Procfile的修改,重新部署即可:git add Procfile git commit -m "Run asset precompile after db migration in release phase" git push heroku master
最后补充一句:如果还是有问题,可以检查下Heroku的环境变量里有没有正确设置DATABASE_URL,不过Heroku通常会自动帮你配置好这个。
内容的提问来源于stack exchange,提问作者Brian C.

