Rails 6.1.6.1应用部署至Heroku失败,请求技术支持
Rails 6.1.6.1 部署到Heroku的问题及解决建议
我把基于Rails 6.1.6.1的应用部署到Heroku时失败了,本地运行正常,但部署出问题。之前用Rails 7部署同款应用是成功的,部署过程中看到几个警告:
- Windows环境生成的Gemfile.lock被移除,Bundler将重新解析依赖
- 应用未安装net-smtp,需添加至Gemfile并执行bundle install
- Rails配置检测失败,可设置HEROKU_DEBUG_RAILS_RUNNER=1调试
- 未检测到Procfile,使用默认Web服务器
完整部署日志
D:\develop\rubyproject\alphablog>git push heroku main 枚举对象:9,完成。 计数对象:100% (9/9),完成。 使用最多8线程进行增量压缩 压缩对象:100% (6/6),完成。 写入对象:100% (6/6),607字节 | 607.00 KiB/s,完成。 总计6个(差异4个),复用0个(差异0个),未复用0个 remote: 压缩源文件... 完成。 remote: 构建源文件: remote: remote: -----> 在Heroku-20栈上构建 remote: -----> 使用buildpack:heroku/ruby remote: -----> 检测到Ruby应用 remote: -----> 安装bundler 2.3.10 remote: -----> 移除Gemfile.lock中的BUNDLED WITH版本 remote: -----> 编译Ruby/Rails remote: -----> 使用Ruby版本:ruby-3.1.2 remote: remote: ###### 警告: remote: remote: 正在移除`Gemfile.lock`,因为它是在Windows上生成的。 remote: Bundler将进行完整依赖解析,以正确处理原生gem。 remote: 这可能导致应用使用意外的gem版本。 remote: 在极少数情况下,Bundler可能无法解析你的依赖。 remote: remote: -----> 使用bundler 2.3.10安装依赖 remote: 执行:BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin bundle install -j4 remote: 从https://rubygems.org/获取gem元数据........... remote: 解析依赖..... remote: 使用rake 13.0.6 remote: 使用concurrent-ruby 1.1.10 remote: 使用minitest 5.16.2 remote: 使用zeitwerk 2.6.0 remote: 使用builder 3.2.4 remote: 使用erubi 1.11.0 remote: 使用racc 1.6.0 remote: 使用crass 1.0.6 remote: 使用rack 2.2.4 remote: 使用nio4r 2.5.8 remote: 使用websocket-extensions 0.1.5 remote: 使用marcel 1.0.2 remote: 使用mini_mime 1.1.2 remote: 使用msgpack 1.5.4 remote: 使用bundler 2.3.10 remote: 使用ffi 1.15.5 remote: 使用method_source 1.0.0 remote: 使用pg 1.4.2 remote: 使用thor 1.2.1 remote: 使用tilt 2.0.11 remote: 使用semantic_range 3.0.0 remote: 使用turbolinks-source 5.2.0 remote: 使用i18n 1.12.0 remote: 使用tzinfo 2.0.5 remote: 使用activesupport 6.1.6.1 remote: 使用nokogiri 1.13.8 (x86_64-linux) remote: 使用rack-test 2.0.2 remote: 使用websocket-driver 0.7.5 remote: 使用mail 2.7.1 remote: 使用bootsnap 1.13.0 remote: 使用puma 5.6.4 remote: 使用rack-proxy 0.7.2 remote: 使用sprockets 4.1.1 remote: 使用sassc 2.4.0 remote: 使用turbolinks 5.2.1 remote: 使用rails-dom-testing 2.0.3 remote: 使用loofah 2.18.0 remote: 使用globalid 1.0.0 remote: 使用activemodel 6.1.6.1 remote: 使用rails-html-sanitizer 1.4.3 remote: 使用activejob 6.1.6.1 remote: 使用activerecord 6.1.6.1 remote: 使用actionview 6.1.6.1 remote: 使用actionpack 6.1.6.1 remote: 使用jbuilder 2.11.5 remote: 使用actioncable 6.1.6.1 remote: 使用activestorage 6.1.6.1 remote: 使用actionmailer 6.1.6.1 remote: 使用railties 6.1.6.1 remote: 使用sprockets-rails 3.4.2 remote: 使用actiontext 6.1.6.1 remote: 使用actionmailbox 6.1.6.1 remote: 使用webpacker 5.4.3 remote: 使用rails 6.1.6.1 remote: 使用sassc-rails 2.1.2 remote: 使用sass-rails 6.0.0 remote: 依赖安装完成!Gemfile中有16个依赖,现在共安装了56个gem。 remote: 未安装'development'和'test'组中的gem。 remote: 已安装的gem存放在`./vendor/bundle` remote: 依赖安装完成(耗时2.83秒) remote: 清理bundler缓存。 remote: -----> 安装node-v16.13.1-linux-x64 remote: -----> 安装yarn-v1.22.17 remote: -----> 检测rake任务 remote: -----> 为Rails资源管道准备应用 remote: 执行:rake assets:precompile remote: 你的应用未安装net-smtp,请将其添加到Gemfile并执行bundle install remote: yarn install v1.22.17 remote: [1/4] 解析包... remote: [2/4] 获取包... remote: [3/4] 链接依赖... remote: [4/4] 构建新包... remote: 完成,耗时15.60秒。 remote: 编译中... remote: 已编译/tmp/build_a9f44d06/public/packs中的所有包 remote: 哈希值:964bd55ba6668af1f1c1 remote: 版本:webpack 4.46.0 remote: 耗时:3673毫秒 remote: 构建时间:2022年8月9日 上午6:46:50 remote: 资源 大小 块 块名称 remote: js/application-4cb2b08e3c41888f7737.js 68.2 KiB 0 [已输出] [不可变] application remote: js/application-4cb2b08e3c41888f7737.js.br 15.2 KiB [已输出] remote: js/application-4cb2b08e3c41888f7737.js.gz 17.5 KiB [已输出] remote: js/application-4cb2b08e3c41888f7737.js.map 204 KiB 0 [已输出] [开发版] application remote: js/application-4cb2b08e3c41888f7737.js.map.br 43.4 KiB [已输出] remote: js/application-4cb2b08e3c41888f7737.js.map.gz 50.2 KiB [已输出] remote: manifest.json 364字节 [已输出] remote: manifest.json.br 129字节 [已输出] remote: manifest.json.gz 142字节 [已输出] remote: 入口点 application = js/application-4cb2b08e3c41888f7737.js js/application-4cb2b08e3c41888f7737.js.map remote: [3] ./app/javascript/packs/application.js 480字节 {0} [已构建] remote: [4] ./app/javascript/channels/index.js 205字节 {0} [已构建] remote: [5] ./app/javascript/channels sync _channel\.js$ 160字节 {0} [已构建] remote: + 3个隐藏模块 remote: remote: 资源预编译完成(耗时23.49秒) remote: 清理资源 remote: 执行:rake assets:clean remote: 你的应用未安装net-smtp,请将其添加到Gemfile并执行bundle install remote: -----> 检测Rails配置 remote: remote: ###### 警告: remote: remote: 正在移除`Gemfile.lock`,因为它是在Windows上生成的。 remote: Bundler将进行完整依赖解析,以正确处理原生gem。 remote: 这可能导致应用使用意外的gem版本。 remote: 在极少数情况下,Bundler可能无法解析你的依赖。 remote: remote: ###### 警告: remote: remote: 检测Rails配置失败 remote: 设置HEROKU_DEBUG_RAILS_RUNNER=1进行调试 remote: remote: ###### 警告: remote: remote: 未检测到Procfile,使用默认Web服务器。 remote: 我们建议通过Procfile明确声明如何启动服务器进程。 remote: remote: remote: -----> 发现进程类型 remote: Procfile声明的类型 -> 无 remote: buildpack的默认类型 -> console, rake, web remote: remote: -----> 压缩中... remote: 完成:91.6M remote: -----> 启动中... remote: 发布版本v7 remote: https://alphablogonr6.herokuapp.com/ 已部署到Heroku remote: remote: 此应用使用Heroku-20栈,但有更新的栈可用。 remote: 要升级到Heroku-22,请查看相关文档。 remote: remote: 验证部署... 完成。 To https://git.heroku.com/alphablogonr6.git aaa1b45..55e9f84 main -> main
问题解决步骤
1. 处理Windows生成的Gemfile.lock
Windows和Linux的原生gem依赖存在差异,Heroku会自动移除Windows环境生成的Gemfile.lock并重新解析依赖,可能导致版本不一致。解决方法:
- 用WSL、Docker等Linux环境生成Gemfile.lock,再提交到Git仓库
- 或删除本地Gemfile.lock,让Heroku自动解析依赖,但需注意可能出现的版本兼容问题
2. 安装net-smtp gem
Rails 6.1的Action Mailer依赖net-smtp,但该gem在Ruby 3.x中不再默认包含。操作步骤:
- 打开项目根目录的
Gemfile,添加一行:gem 'net-smtp' - 本地执行
bundle install更新依赖 - 提交Gemfile和Gemfile.lock的更改后重新部署
3. 调试Rails配置检测失败
这个警告暂时不影响应用运行,但可以排查配置问题:
- 在Heroku设置环境变量:
heroku config:set HEROKU_DEBUG_RAILS_RUNNER=1 - 重新部署,查看详细日志定位配置文件的语法或路径问题
4. 添加Procfile(可选但推荐)
Heroku会使用默认Web服务器,但添加Procfile可以明确服务器启动命令,避免后续问题:
- 在项目根目录创建
Procfile文件,内容为:web: bundle exec puma -C config/puma.rb - 提交文件后重新部署
内容的提问来源于stack exchange,提问作者user2951498
相关产品推荐
相关产品推荐

