トレタ開発者ブログ

飲食店向け予約/顧客台帳サービス「トレタ」、モバイルオーダー「トレタO/X」などを運営するトレタの開発メンバーによるブログです。

RubyKaigi2017参加報告

サーバーサイドエンジニアの中野です。

大分期間が空いてしまいましたが、9/18〜9/20に広島で開催されたRubyKaigi2017のレポートです。3日目のBundler2のセッションの紹介をしたいと思います。

1系は1.16.xxが最後になる予定

1.16は現在開発中でまだstableではないですが、1系では1.16.xxが最後にバージョンになります。
もし1.15を使用している場合にbundle installコマンドを実行すると↓のようなワーニングが出力されます。

$ bundle install
The latest bundler is 1.16.0.pre.3, but you are currently running 1.15.4.
To update, run `gem install bundler --pre`

このワーニングの必要性に関しては個人的にも気になっていたのですが、開発中のバージョンを使ってもらうことでバグを洗い出したり仕様の問題などを見つけたいなどの理由があるようですが、意図せずバージョンを上げてしまう危険性もはらんでいる等の意見もあったりでこの問題を扱ったissueで活発に議論されました。
ちなみに、bundle config disable_version_check trueをすればでこのワーニングは表示されなくなります。

Bundler2について

興味深かったものをいくつか紹介していきます。
Bundler2のRFCの草稿はこちらで見ることができます。

コマンドを指定しないでbundleを実行するとhelpが出力される

1系では、コマンドを指定しないでbundleを実行するとbundle installが実行されていたのですが、2系からはhelpが出力されるように変更されます。個人的には便利で多用してたので少し残念な変更です。issueはこちら

Gemfile、Gemfile.lockがそれぞれgems.rb、gems.lockに変更される

この変更は話題にもなったためご存知の方も多いと思います。
2系でもGemfileとGemfile.lockはそのまま使用できますが、bundlerのバージョンが2系でrails newをした場合にはgems.rbとgems.lockが作成されるようになります。
名前変更の経緯を知りたかったのでissueをあさってみたところ、2010年にUNIXのLOCK拡張子があるのに異なる用途で同じ拡張子を使用するのはどうなの?というissueが立てられており、結果としてファイル名を変更することになったようです。

Gemfile内のgemをすべてアップデートする bundle update--all オプションの指定が必須になる

2系からGemfileのgemをすべてアップデートするために--allが必須になります。
理由としては、Gemfileに新たなgemを追加した時に bundle install すべきところにbundle updateしてしまう例が多かったためらしいです。自分もrailsを触り始めたばかりの頃にbundle updateしてしまって関係のないgemまですべてアップデートしてしまうことがあったので有り難い仕様変更だと思います。issueはこちら

githubやbitbucketなどに置いてあるgemをインストールするためのショートカットが使用できなくなる

gemにパッチをあてて使用してる場合にGemfileでそのgemを置いてあるサービス名をキーにしてuser/repoを指定するとインストールできてたのですが、これができなくなります。ただrailsの場合、5.0.1移行でrails newした際に作成されるGemfileには

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

が追加されておりgithubだけはショートカットが使えるようになってます。他のサービスも↑のように書くことでショートカットが使用できるようになります。

Bundle Plugin

Bundlerにはpluginという機能があり目的に応じた機能を追加することが可能となっています。
pluginの機能が用意されたのは、bundlerが大きくなるに連れ機能の要望が増え、開発、そしてメンテナンスしていくことが困難になってきたので、pluginという形で機能追加をする場を用意することで開発者各々が独自機能をbundlerのリリースを待たずに追加できるようにしたかったという経緯があります。バージョン1.13から用意されているのですが、まだドキュメント無くほとんど知られてないためドキュメント含め一緒にpluginを開発してくれる人大歓迎!とのことでした。

pluginの作り方

作り方はgemのそれとほとんど同じで、違いは一番上の階層にplugins.rbというファイルを用意しpluginのコードを書きます。
例としてbundle hogeと入力するとHogeと出力されるpluginの作り方を簡単に紹介します。hogeというgemを作成し↓のようなplugins.rbを用意します。

module Hoge
  class Plugin < Bundler::Plugin::API
    command "hoge"

    def exec(command, args)
      puts "Hoge"
    end
  end
end

これを通常と同じくrubygems.orgにアップすると、bundle plugin install hogeのようにして作成したpluginをインストールすることができるようになります。インストールが完了するとpluginが使用できるようになります。

$ bundle hoge
Hoge

おわりに

簡単ではありますがBundler2についての紹介をさせていただきました。
11月に開催されるRubyConfでは、Bundlerを初期から長くメンテをしているAndré Arkoがbundlerの歴史についてのセッションを行うので個人的にとても楽しみです。

なお、弊社では国内外のカンファレンス参加費用の補助制度があり、今回のRubyKaigiは会社の経費で参加させて頂きとても感謝しています。来年の仙台で開催されるRubyKaigiに参加したい方は是非ご応募下さい。

www.wantedly.com

© Toreta, Inc.

Powered by Hatena Blog