【发布时间】:2016-07-18 16:58:09
【问题描述】:
有没有一种控制台方式可以将我的 rails 升级到新的 5.0 版本?
或者我是否必须手动替换升级所需的每个文件?互联网似乎含糊不清地给我一个解决这个问题的方法。
【问题讨论】:
标签: ruby-on-rails
有没有一种控制台方式可以将我的 rails 升级到新的 5.0 版本?
或者我是否必须手动替换升级所需的每个文件?互联网似乎含糊不清地给我一个解决这个问题的方法。
【问题讨论】:
标签: ruby-on-rails
几天前我刚刚经历了这个,这是我的(成功的)过程:
首先,在升级之前确保您的应用在 Ruby 2.2+ 上运行。
然后将 Rails 更新到最新的 4.x 版本(现在是 4.2.7),并运行您的测试套件(或完全运行您的应用程序)并查看日志中的弃用警告。
如果您发现任何弃用,请修复这些弃用。
仔细阅读5.0 release notes 并记下可能会影响您的应用的事项。
检查您的Gemfile 和Ready4Rails,这应该有助于告诉您您拥有的哪些宝石可能还没有为Rails 5 做好准备。 [注意:Ready4Rails.net 似乎已于 2020 年 1 月 13 日被撤下]
您可能需要访问您的一些 gem 的主存储库,以查看是否有可能支持但尚未完全发布的分支。您可能希望将这些 gem 的 Gemfile 固定到预发布版本或 fork(即使您不立即采用,这也可以帮助您在这些 gem 的最终版本发布时运行)。
它也可能有助于减少你的依赖。例如,您的development 块中可能有一堆尚未更新的宝石。没有这些你可能可以活一段时间。
有些人会建议您删除Gemfile 和bundle update 中的版本号。除了非常小的应用程序之外,我建议不要这样做。一次更改太多内容会导致很难追踪问题。
像这样更改Gemfile 中列出的 Rails 版本:
gem 'rails', '= 5.0.0'
然后运行bundle update rails。
这可能会失败,并为您提供捆绑程序无法解决的版本号比较列表。寻找最终要求 rails 小于 5 的任何依赖项,并查看是否可以更新。
更改该 gem 的版本,撤消对 rails 版本的更改。 bundle update 那个 gem,再次运行你的套件(或者练习你的应用程序中使用那个 gem 功能的部分)并寻找弃用。
提交您正在进行的小步骤并根据需要重复,直到您最终可以将 Rails 固定到 5.0.0。
一旦你解决了这些阻塞依赖,并且bundle update rails 成功完成,提交它并再次运行你的测试套件。
如果您的套件与我的套件相似,那么这里会有一堵弃用墙,但通常每次测试都会重复一些事情。现在并不一定要解决这些问题,但我会解决嘈杂的问题……它们可能会让更重要的问题更难看到。我不得不将大量控制器规格从 post :foo, name: 'bar' 更改为 post :foo, params: { name: 'bar' } 以消除命名参数语法弃用警告。
您可能还需要更新一些代码来修复一些失败的规范。幸运的是,我不必这样做,但是如果您更新了任何东西,您应该能够将根本原因追溯到 Rails 或您的一个 gem 的更改。
现在,您应该运行 bin/rails rails:update 来更新您的配置文件。仔细区分其中的每一个以寻找变化。我更喜欢从 diff 输出中复制/粘贴行,然后手动将它们复制到我的配置中,并在必要时进行调整,并保持差异,直到我看到的只是我在 diff 中的自定义设置。
完成所有这些后,再次运行您的规范,并实际打开应用程序并确保它按预期工作。将其推送到暂存环境以确保它在类似生产环境中的行为也可能很有用。
查看bin/rails rails:update (config/initializers/new_framework_defaults.rb) 创建的文件,看看您是否可以在不影响应用行为的情况下禁用或注释掉这些文件。
这些行为以及其他更改通常记录在Upgrading Ruby on Rails Guide
希望你现在已经完成了,但是你可以带来一些额外的细节。我切换到一个新目录并使用rails new rails5project 生成一个全新的Rails 应用程序,并复制您的应用程序中可能没有的新文件,例如app/models/application_record.rb 和app/mailers/application_mailer.rb(以及从它们继承的转换模型而不是ActiveRecord::Base 和 ActionMailer::Base)。
另外,app/assets/javascripts/cable.js、app/assets/javascripts/channels 和 app/channels,如果你想使用 ActionCable,app/jobs 如果你想使用 ActiveJob`
然后查看最新的 Rails 5 应用程序的Gemfile,如果需要,可以带上那里列出的所有宝石。例如,Rails5 现在默认附带 Turbolinks 5、Puma、listen 和 spring-watcher-listen。
希望,在这一切之后,你的应用程序仍然可以满足你在 Rails 5 上运行的所有需求。但是,如果你因为 gem 依赖而被阻止,希望你可以保留这个分支,直到一切准备好并合并它!
【讨论】:
即使我正在尝试将我的 rails 版本升级到 rails 5
这是一份来自here的清单
将ruby 版本更改为2.2.2
在app/models/ 中创建application_record.rb 并添加:
# app/models/application_record.rb
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
并确保所有模型都继承自它。
# app/models/user.rb
class User < ApplicationRecord
end
在app/jobs/ 中创建application_job.rb 并添加:
# app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base
end
在Gemfile 中更改rails 的版本
gem 'rails', '5.0.0'
Ruby 2.2 不支持调试器,而 Rails 5 需要它。
gem 'byebug'
捆绑宝石
bundle install
bundle install 将抛出错误或警告某些 gem 将其版本更改为 rails 5 所需的版本
【讨论】:
只需按照此操作,并确保您满足最低 Ruby 要求
http://guides.rubyonrails.org/upgrading_ruby_on_rails.html
基本方法(不完全安全,但会升级):
在您的 gemfile 中指定
gem 'rails', '5.0.0'
然后在你的终端中
bundle update rails
【讨论】: