忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2018-11-24(Saturday)

bundlerでgemを入れる環境でcommandline toolを簡単に作る

あららお久しぶり。なんと1年ちょっとぶりでございます。

さて、Thorでどうこうというお話ではありません。いや、試していないんですけど、多分。

Rubyでコマンドラインツールを作るときに、bundlerで入れるgemを使うけど、このgemは他の混ざらないように以下のように入れるとしましょう。

hiraku@shako:~/mytool$ bundle --path=.bundle
Fetching gem metadata from https://rubygems.org/.............

まあ、よくあるパターンです。

こういう状態で、スクリプトを以下のように無造作に書いてしまうと

#!/usr/bin/env ruby

require "bundler/setup"
require "nokogiri"
p Nokogiri

Gemfileを置いてるディレクトリだと問題なく実行できるんですが

hiraku@shako:~/mytool$ ./mytool.rb 
Nokogiri

他のディレクトリから実行しようとするとエラーになります。

Traceback (most recent call last):
	2: from /home/hiraku/mytool/mytool.rb:3:in `<main>'
	1: from /opt/ruby/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
/opt/ruby/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': cannot load such file -- nokogiri (LoadError)

(今時2.5.0なのは気にしないでください…)

Railsなんかだと、 config/boot.rb で以下のように書いてあったりします

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)

require 'bundler/setup' # Set up gems listed in the Gemfile.

でも個人的にスクリプトの中で環境変数を書き換えるのはちょっと気が引けて(我儘)、もうちょっと簡単にかけないかと思いついたのがこんな書き方です。

Dir.chdir(__dir__){ require "bundler/setup" }

スクリプトの中で一瞬だけchdirするのが気持ち悪いという説がありそうな気もしますが、メリットもあって、bin/sub/foo.rb みたいにちょっと深めのディレクトリに配置しても(するなよ)同じ書き方で通用します。Railsのよりもちょっと短いし、環境変数どれだっけと思い出すのに苦労せずにすみます。

「…あのディレクトリ取る変数、何だっけ」

どっとはらいヽ(´−`)丿

Tags: Ruby