Hatena::ブログ(Diary)

ぬいぐるみライフ(仮) RSSフィード

2010-09-07

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で動かせなくなる.

dicedice 2010/12/06 01:36 はじめまして。
requireで読み込むパスに、明示的にカレントディレクトリを指定することでも
解決できるようです。

require "./bar" # カレントディレクトリの bar.rb を探す

mickey24mickey24 2010/12/11 22:49 はじめまして!
なるほど,この方法は知りませんでした.
ありがとうございます!

buttchinbuttchin 2011/08/01 19:08 ほっほっほほー、助かった!

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。