2013-08-22 72 views
1

在處理開發寶石的「路徑」時,我經歷了一些痛苦。 這裏是文件夾結構開發寶石時讀取文件(在lib下)的最佳做法是什麼?

生產代碼:

lib/gem_name/foo/templates/some_template.erb 
lib/gem_name/foo/bar.rb 

測試代碼:

test/gem_name/foo/bar_test.rb 

在bar.rb,我讀由模板:

File.read("templates/some_template.erb") => Errno::ENOENT: No such file or directory 

當我在RubyMine的bar_test.rb中運行單元測試,它給了我錯誤:

Errno::ENOENT: No such file or directory - D:/.../test/gem_name/foo/templates/some_template.erb 

顯然測試中的路徑是錯誤的。

我的問題是,

  1. 如何處理這個問題?
  2. 什麼是最好的做法處理 等路徑問題,同時開發寶石?

編輯
由於__FILE__只返回它寫入的文件的路徑,目前我定義fname(見@ ckruse的回答)喜歡在每一個文件,我需要它的功能。 它的作品,但它不優雅。也許有人會有比我更好的解決方案。如果是的話,請讓我知道:)

回答

5

您可以隨時File.dirname(__FILE__)指當前文件的目錄,然後使用相對pathes,如:

fname = File.dirname(__FILE__) + "/templates/some_template.rb" 
File.read(fname) 

編輯:爲了縮短這一隻寫一個方法:

def fname(file) 
    File.dirname(__FILE__) + "/../til/../project/../root/../" + file 
end 

編輯3:您還可以使用呼叫者總是引用調用文件的目錄:

def fname(file) 
    path, _ = caller.first.split(':', 2) 
    File.dirname(path) + "/" + file 
end 
+0

謝謝@ckruse。我知道我可以做到這一點,但我不確定這是否是一種好的做法,因爲每次我需要加載文件時,我必須寫入'File.dirname(__ FILE__)+「/templates/xxxx.xxx」 。似乎有點冗長。 –

+1

這就是封裝的用途;-)編寫一個返回正確路徑的函數。我爲此編輯解決方案。 – ckruse

+0

你有什麼建議在何處或如何放置這種方法?我認爲這種方法將用於生產代碼和測試代碼。 –

相關問題