実行しているプログラムのパスを取得する
組み込み変数「$PROGRAM_NAME」と疑似変数の「__FILE__」が使えそうです。
- 疑似変数の「__FILE__」は現在実行しているプログラムのパスを返します。requireしたソース内で実行すると、「requireしたソースのパス」となります。
- 組み込み変数「$PROGRAM_NAME」は、現在実行中のRubyスクリプトの名前を返します。requireしたソース内で実行してもメインプログラムのパスを返します。
ファイル構成:
├a │ └b.rb ├additional-load-path │ └x │ └y.rb └script-path.rb
script-path.rb:
# "./additional-load-path"を検索パスに追加。 $: << "./additional-load-path" require "a/b" require "x/y" puts "\nroot ---" puts __FILE__ puts $PROGRAM_NAME
a/b.rb
puts "\na/b ---" puts __FILE__ puts $PROGRAM_NAME
additional-load-path/x/y.rb
puts "\nadditional-load-path/x/y ---" puts __FILE__ puts $PROGRAM_NAME
出力:
a/b --- ./a/b.rb xxx/script-path.rb additional-load-path/x/y --- ./additional-load-path/x/y.rb xxx/script-path.rb root --- xxx/script-path.rb xxx/script-path.rb
requireしたモジュールと同じディレクトリにあるファイルを読み込む
やりたかったのはコレ。
- requireしたモジュールから、モジュールと同じディレクトリにあるファイル(リソース的なもの)を読む。
- モジュールの利用者は読むファイルを知らない。(内部に隠蔽して、知らなくても使えるようにしたい。)
以上より、疑似変数の「__FILE__」をつかうと実現できそうです。
# モジュールと同じディレクトリにある"test.txt" をロードする。 puts IO.read( File.dirname(__FILE__) + "/test.txt" )