如何升級兩年半前的專案


#1

目前小弟要開發一個已經停滯2年半的專案,
只有我一個Rails開發者,也沒有交接文件,
基本上可以說就是拿到一包據說完成度八成的Code跟情境介紹文件

目前版本是ruby ‘2.2.2’ rails ‘4.1.2’

想說應該要升級一下,畢竟ruby是兩年半前版本,rails是三年半前…
但是我看rails guide上面說要評估升級的必要性,包括:

  • 对新功能的需求
  • 难于支持旧代码
  • 以及你的时间和技能

問題1:請問要如何評估升級的必要性?

小弟技能只有junior以上,不到senior程度,還是先可以跑就好,有問題再說…
因為感覺無法預估時間,只有我一個人要handle一個小-中型專案
專案有寫Rspec測試,但還不知道覆蓋度如何。

問題2:請問有建議的升級辦法嗎?

目前只知道直接RVM切過去bundle完開始修bug…
但rails guide上面說要一點一點慢慢升級,這樣不知道要花多少時間@@?
另外看到Joker有提到一種乾淨升級的方法,就是新開一個rails專案,
然後慢慢把code貼過去,請問這兩種難易程度、耗費時間、優劣比較是如何呢?
有大大有經驗嗎?

問題3: 在gemfile設定ruby版本與在.ruby-version設定,有何不同?

因為此專案gemfie 設定ruby ‘2.2.2’,但在.ruby-version設定2.1.5
請問所以到底是哪個版本呢?

附上gemfile檔

source ‘https://rubygems.org

ruby ‘2.2.2’

gem ‘rails’, '4.1.2’
gem ‘figaro’, '1.0.0’
gem ‘pg’, '0.18.2’
gem ‘sass-rails’, ‘4.0.3’
#gem ‘sass-rails’, '5.0.1’
gem ‘uglifier’, '>= 1.3.0’
gem ‘coffee-rails’, '~> 4.0.0’
gem ‘jquery-rails’, '3.1.3’
gem ‘jbuilder’, '~> 2.0’
gem 'bootstrap-sass’
gem ‘devise’, '3.5.1’
gem 'haml-rails’
gem ‘rolify’, '4.0.0’
gem ‘simple_form’, '>= 3.0.0.rc’
gem 'settingslogic’
gem ‘carrierwave’, '0.10.0’
gem ‘mini_magick’, '4.0.2’
gem ‘fog’, '1.32.0’
gem 'hashie’
gem 'rails-i18n’
gem 'compass-rails’
gem ‘ckeditor’, :git => 'git@github.com:galetahub/ckeditor.git’
gem ‘momentjs-rails’, '>= 2.8.1’
gem ‘bootstrap3-datetimepicker-rails’, '~> 4.15.35’
gem 'select2-rails’
gem 'jquery-ui-rails’
gem 'kaminari’
gem ‘fullcalendar-bootstrap-rails’, '~> 2.3.1.0’
gem 'gon’
gem 'geocoder’
gem 'geocomplete_rails’
gem 'activerecord-import’
gem ‘cancancan’, '1.11.0’
gem 'bootstrap-switch-rails’
gem ‘active_link_to’, '1.0.3’
gem “font-awesome-rails”, '4.3.0.0’
gem 'zeroclipboard-rails’
gem 'jquery-cookie-rails’
gem 'mina’
gem ‘fabrication’, ‘2.11.3’

group :development do
gem ‘better_errors’, '1.0.1’
gem ‘binding_of_caller’, '0.7.2’
gem 'coderay’
gem 'html2haml’
gem ‘letter_opener’, '1.3.0’
gem ‘capistrano’, '~> 3.2.0’
gem ‘capistrano-rails’, '1.1.2’
gem ‘capistrano-rbenv’, ‘2.0.3’, require: false
gem ‘rails-erd’, require: false
#gem ‘capistrano-bundler’
#gem 'capistrano3-unicorn’
end

group :development, :test, :staging do
gem ‘pry’, '0.9.12.3’
gem ‘pry-nav’, '0.2.3’
gem ‘pry-rails’, '0.3.4’
gem ‘rspec-rails’, '~> 2.99’
gem ‘rspec-sidekiq’, '~> 1.1.0’
gem ‘factory_girl_rails’, '~> 4.5.0’
gem ‘faker’, '1.4.3’
gem ‘guard’, '2.12.5’
gem 'guard-livereload’
gem 'guard-rspec’
gem 'rb-fsevent’
end

group :test do
gem ‘database_cleaner’, '1.2.0’
gem ‘shoulda-matchers’, ‘2.7.0’, require: false
gem ‘capybara’, '2.4.4’
gem ‘capybara-email’, '2.4.0’
gem ‘launchy’, '2.4.3’
gem ‘vcr’, '2.9.3’
gem ‘webmock’, '1.20.4’
gem ‘selenium-webdriver’, ‘2.44.0’
#gem ‘capybara-webkit’, '1.4.1’
end

group :staging do
gem 'unicorn’
end

group :production, :staging do
gem ‘rails_12factor’, ‘0.0.2’
#gem “sentry-raven”, '0.12.2’
end

感謝各位大大!


#2

問題1:請問要如何評估升級的必要性?

你要開發新的東西,會發現gem都只支援新版時,
就是有升級的必要性。

問題2:請問有建議的升級辦法嗎?

先升級到 rails 4.2.10
然後升級 ruby 到 2.4.2
然後升級 rails 5.0.6
然後升級 rails 5.1.4

我最近就是這樣升級的 https://github.com/lulalala/mei/commits/master

問題3: 在gemfile設定ruby版本與在.ruby-version設定,有何不同?

不知道但是都會把兩者都設為一樣的


#3

升級的必要性
官方答案:系統安全有保障
實際答案:新功能是重要嗎

.ruby-version是rbenv的設定檔
如果你沒有使用rbenv它不會影響你的系統運作的

gemfile內的ruby版本貌似影響deployment的設定,也有機會完全不影響,看環境?


#4

但是我terminal 一切進去專案,就會跳
Required ruby-2.1.5 is not installed.
To install do: ‘rvm install “ruby-2.1.5”’

因為我電腦環境是用RVM,但是專案原本是用rbenv,
所以怎樣配置會比較好呢?配合專案改用RVM嗎?還是相反


#5

我單純給你個最基本也最快速的升級建議:重來一次唄

開一個新的專案,你想用啥都行,開一個基本的 scaffold 來做對照,把檔案一個一個貼過去,我指的是流程的 code 而非架構或整個檔案,注意外包裝,結束

簡單的來說

[Rails 4 的 migration]
class Init < ActiveRecord::Migration
  def change
    ...
  end
end
[Rails 5 的 migration]
class Init < ActiveRecord::Migration[5.1]
  def change
    ...
  end
end

[Rails 4 的 model]
class User < ActiveRecord::Base
  ...
end
[Rails 5 的 model]
class User < ApplicationRecord
  ...
end

中間關鍵 code 保留,外包裝改成新版的,這次改最多的應該是外包裝而已唄(一票檔案都是|||,雖然其實舊的包裝還是可以用啦,不過既然升級就一起改唄 X"D),gem 之類的應該還是可以復用,不過建議都更新成新版的,然而 deploy 之類的也就都可以自己搞了(你的 rvm vs rbenv 問題),除非你的專案用了太多底層的東西且被改光光了,不然這樣做是最快速的唄,檔案應該沒很多,每個檢查一次就結束了

((不過其實我到目前為止都是 passenger + rvm 派的,而如果包裝成 docker 則會是原生 ruby 即可,單純 rbenv 用不順手|||