Ruby 1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなった

タイトルの通り,Ruby 1.9.2から$LOAD_PATHにカレントディレクトリが含まれなくなった($:も同様).この変更により,以下のような条件でrequireを使っているスクリプトが動かなくなった.

  • スクリプトが置いてあるディレクトリdirで実行することが前提として作られている
  • 他のスクリプトをdirからの相対パスでrequireしている
$ cat foo.rb
require "bar"
$ cat bar.rb
puts "baz"
$ ruby foo.rb
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load -- bar (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from foo.rb:1:in `<main>'

この場合,以下の解決策が考えられる.

  1. $LOAD_PATHにdirのパスを追加する
  2. requireの変わりにrequire_relativeを使い,スクリプトファイルからの相対パスを指定する

require_relativeを使った場合の例は以下の通り.

$ cat foo.rb
require_relative "bar"
$ cat bar.rb
puts "baz"
$ ruby foo.rb
baz

ただし,require_relativeはRuby 1.9.1以降にKernelモジュールに追加されたメソッドなので,これを使うと以前のバージョンのRubyで動かせなくなる.