Ruby1.9の$LOAD_PATHにはカレントディレクトリがない

自作スクリプトをrequireしたらコケた。 Ruby1.9の$LOAD_PATHにはカレントディレクトリがないらしい。

対策をWebで探す。 require ‘./myscript’ みたいに相対パスで書けばいいよーという記事が多い。 しかしそんなんでは、shのカレントディレクトリがscriptと違うときに困るんじゃないか? 別ディレクトリから呼んだり、cronから呼び出したり時に困るんじゃないか?

もっとスマートな解決策はなかろうかと思って調べてみる。 やっぱりもうちょっとマトモな方法はあった。しかも二つも。

  • expand_path で絶対パスに展開
  • 相対パスにしたいならrequire_relativeを使う

前者は、まず自分のパスを調べてから相対パスを追加することで、 実行時に絶対パスを生成してそれを利用する方法。 具体的には

require File.expand_path(File.dirname(__FILE__) + '/myscript')

のような感じ。

後者は

require_relative './myscript'

のようにする。

絶対パスの方が何かと安全そうではある。相対パスにするにしても、 相対パス用のrequire_relativeがあるということは、本来こっちを使うべきなんだろうな。

Written on November 15, 2012