Ruby
rubygems
bundler

gem install・bundle installなしでgemを使ったスクリプトを実行する方法

通常、gemを使うには主に以下の2つの方法を使います。

  • gem install fooでgemをインストールしてから使う
  • Gemfileにそのgemを記述し、bundle installでインストールしてから使う

どちらもせずに済ますには、bundler/inlineを使います。

bundler/inlineの使い方

以下はTimers gemを使うサンプルです。

timers.rb
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'timers'
end

timers = Timers::Group.new
every_five_seconds = timers.now_and_every(1) { puts "Hello!" }
loop { timers.wait }

このスクリプトは、Timersを使って1秒ごとに"Hello!"と表示するものです。実行前にgemコマンドもbundlerコマンドを使わず、いきなり、

$ ruby timers.rb

と入力すれば実行できます。

このスクリプトのポイントは1行目のrequire 'bundler/inline'と、3行目からのgemfileのdo〜endブロックです。require 'bundler/inline' とすると、gemfileというメソッドが使えるようになります。このgemfileメソッドのブロックがGemfileの代わりになります。このブロックの2行でTimersが使えるようになります。

このサンプルではrequire 'timers'を暗黙に実行しています。明示的にさせるようにするには以下のようにします。

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'timers', require: false
end

require 'timers'

timers = Timers::Group.new
every_five_seconds = timers.now_and_every(1) { puts "Hello!" }
loop { timers.wait }

5行目のrequire: falseによって、暗黙の読み込みをしないようにしています。そのため、8行目の require 'timers'を削除して実行するとエラーになります。

参考

https://bundler.io/v1.16/guides/bundler_in_a_single_file_ruby_script.html