サーバーサイドエンジニアの中野です。
大分期間が空いてしまいましたが、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に参加したい方は是非ご応募下さい。