最近(2019/02/03)のRuby,Rails,Bundler事情

@vividmuimui
2019/02/06 社内LT

:warning: この資料は 2019-02-03 の時点での情報です!:warning:

1週間も経てばまるっと内容が変わってる部分もあるかもしれないので注意してください!

タイムライン

2018/12/25 :link: Ruby 2.6.0 リリース :tada:
2019/01/04 :link: Bundler 2.0 リリース :tada: 1/3に2.0.0, 1/4に2.0.1
2019/01/18 :link: Rails 6.0.0 beta1 リリース
2019/01/30 :link: Ruby 2.6.1 リリース
2019/02/01 Rails 6.0.0 beta2 がリリース予定。現状ではまだ
2019/03/01 Rails 6.0.0 rc1 リリース予定
2019/04/01 Rails 6.0.0 rc2 リリース予定
2019/04/30 Rails 6.0.0 リリース予定 :tada:
???? Ruby 新元号対応のリリースが平成のうちにあるらしい

Railsのリリーススケジュール
:link: Timeline for the release of Rails 6.0

Ruby 2.6.0 個人的な目玉機能

https://www.ruby-lang.org/ja/news/2018/12/25/ruby-2-6-0-released/

  • :star: Ruby 2.6ではJIT (Just-in-time) コンパイラが導入
    • 有効にするには--jitオプション or $RUBYOPT環境変数
  • :star: Bundler を Default gems として標準添付
    • 2.6.0 には 1.17.2 が同梱、 2.6.1 では 1.17.3
  • Kernel#yield_selfの別名としてthenが追加
  • 終端なしRange
  • Procを関数合成するオペレータProc#<<Proc#>>が追加
  • Kernel#system に失敗時に例外を上げさせるexception:オプションが追加
  • Coverage の oneshot_lines モードの追加

Ruby 2.6.1

:warning: Ruby 2.6.0 はいくつかバグがあるので上げるなら2.6.1!

未だに解決してない問題

それにしても 2.6.0 は使わず、 2.6.1 にすべき!(当たり前だけど)

Rails 6 注目ポイント

:link: Rails 6.0.0 beta1: Action Mailbox, Action Text, Multiple DBs, Parallel Testing, Webpacker by default

Rails6: ActionText

  • JSのライブラリの:link:Trixを使ったWYSIWYG
  • 画像アップロード機能もある
    • ActiveStorage前提
    • モバイルでのアップロードはUIがないので難しい
  • Edgeで動かない
    • 原因わかってない(調べてない)
  • 日本語入力周りは大筋動くがバグもある
    • :link: basecamp/trix#580 このPRが入ればまるっと解決するかも
    • (直ることを祈ってる :pray:)

Rails6: MultiDB support

  • まだまだ絶賛開発中ぽい
  • :link: eileencodesさんのPRを追えば理解できる(と思ってる)
  • 最近入った目玉: :link: Part 8: Multi db improvements, Adds basic automatic database switching to Rails
    • HTTP verbs(GET or HEAD)をみて R/W splitting をする
    • repliation 遅延も考慮して、最後の書き込みから5s経ってたらreplicaからreadする実装も入ってる
      • デフォの挙動はrequest.sessionlast_write_timestampを書き込む
    • デフォルトでは無効化されてる(現状では)

Rails6: parallel testing support

class ActiveSupport::TestCase
  parallelize_setup do |worker|
    # setup databases
  end
   parallelize_teardown do |worker|
    # cleanup database
  end
   parallelize(workers: 2)
end

:link: rails/rails#31900
実装をみればActiveRecordを使わずにDBを触ってる場合でも有効化はできそう

Rails6: その他

リリーススケジュール

2019/01/18 beta1
2019/02/01 beta2
2019/03/01 rc1
2019/04/01 rc2
2019/04/30 リリース予定 :tada:

Bundler 2.0

$ gem install bundler
Fetching: bundler-2.0.1.gem (100%)
Successfully installed bundler-2.0.1
1 gem installed

今普通に gem install bundlerすると 2.0.1が入る

Bundler2: 注目ポイント

  • github: sourceがデフォルトでhttpsになった
  • error/warningがSTDERRに出るようになった
    • bundlerの出力をみて挙動を変えてる処理をライブラリなどで書いてる場合は要注意(ほぼないとは思うが)
  • lockfileの中身を見て、使うbundlerの2系を使うのか1系を使うのかを自動で切り替える
    • bundler -vの結果が2.0.1でも、lockfileの中が↓ならbundle installなどでは自動でbundler 1系に切り替わる
    • BUNDLED WITH
        1.17.2
      

Bundler2: 注目ポイント

以前から噂されていた多くの大きな変更はBundler3に回されている

などなどがbundler3に回されている

:link: An Update on Bundler 2.0
メジャーアップデートのルールに関して書かれてる。とても丁寧な内容のルールになった

  • メジャーアップデートでは即破壊的となるような変更はせず、depricationにし、その次のメジャーバージョンで取り除く
  • セキュリティパッチは1つ前のメジャーバージョンにも適用する
  • 2.0のメジャーアップデートでは、破壊的変更はほぼない
    • 3.0でいろいろ負債を解消するための布石という感じ

Bundler2: 既存アプリでBundler2を使う

$ gem update --system
$ gem install bundler
$ bundle update --bundler

前ページの記事にあるように、2.0にあげるのは問題なく上がる

まとめ・所感

  • ruby 2.6.0はそこそこバグがあるので使うなら2.6.1
    • (当たり前だけど)
    • bundlerが同梱されるようになってバグがまだ残ってそうで、そのバグFIXのリリースもそう遠くないうちにあるかも(?)
    • アプリによっては、様子見して2.5系を使っておく、という選択も全然ありかも
  • Rails6はrcが出るまでは様子見で全然良さそう
    • 普通のWebサイトを作る分には最高のメジャーアップデートになりそう
    • Multi DBに関しては、機能が揃ったらひと通りきちんと内容を把握してから利用したほうが良さそう
      • (当たり前だけど)
  • Bundlerはさくっと2.0にあげれる
    • メジャーバージョンのリリースのルールがとても丁寧な内容に決められ、噂されてた超大型アップデートな内容は3.0に回されたので