簡単な ruby のスクリプトでも、ライブラリのバージョン管理をしたい!

ruby のパッケージ管理ツールである Bundler はとても便利で、当たり前のように普段使いをしています。 ところで、ちょっとした、ちょうど 1 ファイルくらいの軽量スクリプト書くときに、いちいち Gemfile を書いたりする人はあまりいないでしょう。 軽量のスクリプトなら普通に gem install hogehoge みたいにライブラリをインストールし、 require 'hogehoge' してライブラリを読み込むのが普通でしょう。 でも、たまたまこのスクリプトファイルを共有する時とかに、ライブラリのバージョン差異が出て 地味に 不便なんですよね。

そんなわけで、 Bundler にはインラインで依存ライブラリを指定する記法が用意されています。

https://github.com/bundler/bundler-features/issues/47

この issue を読むと、誕生背景やサンプルコード、実装内容に制限事項が網羅されているので解説など不要な気がしますが、 将来の自分のために日本語でまとめておきましょう。 なお、詳しい情報は APIドキュメント に載っていますので、 使いたい方はそちらをご参照ください。

#!/usr/bin/env ruby

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'to_gunma', '0,0.2'
end

array = [1,2,3]
array.to_gunma!
puts array.to_s

上記に示すサンプルコードのように、 require 'bundler/inline' することで インラインで Gemfile を宣言する gemfile メソッドを使えるようになります。

このファイルを実行する環境で gem がインストール済みであれば、 gemfile メソッドのブロック内で定義した ライブラリを自動的に require までしてくれます。

また、第一引数に true を設定することで、未インストールの時に自動的にインストールまでしてくれます。

使いみち

サンプルコードを gist に貼ったりするときのお供にするのが一番の使い道かと思います。

あとは、どっかの github ページとかで、issue の報告とかするときに使うと便利じゃないかなと思います。

特に、issue の報告などでは依存しているライブラリの細かなバージョンを報告すると喜ばれます。 ですので、1ファイル内で細かなバージョン番号を指定できるインライン記法が好んで使われるわけです。