2009-04-25 10 views
51

(実行されているスクリプトと同じ)同じディレクトリにあるファイルを要求する方法はありますか?ruby​​の同じディレクトリにファイルを必要とする短い方法はありますか?

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

私は(ルビーは、それが実際には同じスクリプトであることを認識しません)require "my_script"及びrequire "./my_script"は、実際には2回のスクリプトをロードすることを読んで、これはFile.expand_pathが推奨される理由です:それが毎回使用されている場合スクリプトが必要な場合は、一度だけロードされます。

Rubyのような簡潔な言語では、より短期間の解決策がないように思えます。たとえば、Pythonは単にこれを持っている:

import .some_other_module_in_the_same_directory 

私は猿パッチrequireことができると思います...しかし、それはただ悪です! ;-)

答えて

2

上記のスクリプトは、他のディレクトリからスクリプトを実行している場合でも動作します。 しかし、同じディレクトリの中では、あなたが参照する短い形式が期待どおりに機能し、少なくとも1.9のルビではダブル・ニーズが発生しません。しかし、長い形式でも動作します

start test A 
start test B 
finish test B 
finish test A 

testa.rb

puts "start test A" 
require 'testb' 
require './testb' 
puts "finish test A" 

testb.rb

puts "start test B" 
puts "finish test B" 

'ルビーtesta.rb' を実行することになります別のディレクトリから(例えば、ruby somedir/script.rb)

2

標準ライブラリディレクトリ(デフォルトのロードパス$:にすでにだどこか)でこれを入れて:

# push-loadpath.rb 
if caller.first 
    $: << File.expand_path(File.dirname(caller.first)) 
end 

その後、これは動作するはず

% ls /path/to/ 
bin.rb lib1.rb lib2.rb #... 
% cat /path/to/bin.rb 
load 'push-loadpath.rb' 
require 'lib1' 
require 'lib2' 
#... 

callerを使用すると、現在のコールスタックへのアクセスを提供し、そして伝えますあなたはどのファイルをどこに置いているのですか。だからpush-loadpath.rbはそれを使ってロードパスにloadというファイルを追加します。

requireファイルではなく、loadファイルである必要があります。そのため、本文は複数回呼び出すことができます(ロードパスを変更するたびに1回)。

代わりに、あなたは方法で体を包むことができ、

# push-loadpath.rb 
def push_loadpath 
    $: << File.expand_path(File.dirname(caller.first)) 
end 

これは、あなたがそれをrequireすることができ、このようにそれを使用します。

% ls /path/to/ 
bin.rb lib1.rb lib2.rb #... 
% cat /path/to/bin.rb 
require 'push-loadpath' 
push_loadpath 
require 'lib1' 
require 'lib2' 
#... 
11

ちょうどfilenameが必要です。

はい、filename./filenameと指定した場合は2回インポートされますので、それを行わないでください。 .rbを指定していないので、パスを指定しないでください。私は通常lib内のファイルに自分のアプリケーション・ロジックの大部分を入れ、その後、次のようになりますbin内のスクリプトいる:もう一つの利点は、ロード場合、私はそれが簡単にユニットテストを行うには見つけること

#!/usr/bin/env ruby 

$: << File.join(File.dirname(__FILE__), "/../lib") 
require 'app.rb' 
App.new.run(ARGV) 

ですアプリケーションロジックは自動的に実行を開始しません。

83

ルビー1.9以降、require_relativeを使用できます。

+0

私はあなたの答えを早く見て欲しいです。 –

関連する問題