2010-08-29 113 views
12

我在幾個文件中有不同類的Ruby代碼。在一個文件中,我開始執行。這個文件require是我的其他文件。Ruby需要路徑

  • 這是啓動一個ruby代碼的好方法嗎?
  • 當我從符號鏈接運行代碼時,例如DIR2/MyRubyCode是主文件DIR1/MyRubyCode.rb的鏈接,那麼我的要求將會失敗。我通過在require之前將路徑DIR1添加到$LOAD_PATH來解決問題,但我認爲會有更好的方法來完成它。你有什麼建議嗎?

回答

16

如果你想檢查一個Ruby文件被「require‘版或’ruby MyRubyCode.rb」執行,檢查__FILE__不變。

# If the first argument to `ruby` is this file. 
if $0 == __FILE__ 
    # Execute some stuff. 
end 

就require/$ LOAD_PATH問題而言,您始終可以在require語句中使用相對路徑。例如:

# MyRubyCode.rb 
require "#{File.dirname(__FILE__)}/foo_class" 
require "#{File.dirname(__FILE__)}/bar_module" 

,其中將包括在同一目錄MyRubyCode.rbfoo_class.rbbar_module.rb文件。

+1

謝謝但如果我需要File.dirname(__ FILE__),當我使用別名啓動代碼時,它也嘗試從'。'包含。我仍然有'沒有這樣的文件加載'錯誤。 – 2010-08-29 17:21:40

+1

這是正確的。你將不得不得到符號鏈接的目標(這將代替'File.dirname()')。看看這個帖子的幾種不同的方式做到這一點: http://stackoverflow.com/questions/1237939/ruby-how-do-i-get-the-target-of-a-symlink – 2010-08-29 17:36:08

+2

謝謝。它適用於'$ LOAD_PATH << File.dirname(Pathname.new(File.expand_path(__ FILE __))。realpath.to_s).to_s'。 – 2010-08-30 07:18:51

6

我知道這是一個老問題,但有一個更新的回答是,我想將它張貼:

在較新版本的Ruby的開始(我不知道的時候),你可以通過以下需要在同一個目錄下的文件:

require './foo_class' 
require './bar_module' 

,它會載入文件名爲在同一個目錄foo_class.rbbar_module.rb

要檢查您的文件是否爲require d或正常運行,請檢查其他答案。

+2

這個答案沒有解決原始問題中的用例,因爲它仍然會失敗如果ruby文件正在從符號鏈接調用或位於用戶的路徑上。 – Nathan 2013-12-02 19:03:41

17

如果您使用的是Ruby 1.9或更高版本,那麼您的依賴關係需要用戶require_relative。

require_relative 'foo_class' 
require_relative 'bar_module'