2013-08-22 1 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 

, когда я запустите тестовый блок в bar_test.rb в RubyMine, он дает мне ошибку:

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

Очевидно, что теств пути не так.

Моим вопрос является,

  1. Как бороться с этими вопросами?
  2. Что такое наилучшая практика для обработки такой путь проблема при разработке драгоценного камня?

Edit:
Поскольку __FILE__ только возвращает путь к файлу написано, в настоящее время я определяю fname (см @ ответ ckruse в) как функции в каждом файле, мне нужно это. Это работает, но это не изящно. Возможно, у кого-то будет лучшее решение, чем у меня на этом. Если да, то пожалуйста, дайте мне знать :)

ответ

5

Вы всегда можете обратиться к каталогу текущего файла по File.dirname(__FILE__), а затем использовать относительные тракты, например:.

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

Edit: комбинаций это просто написать метод:

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

Edit 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

Есть ли у вас какие-либо предложения о том, где и как разместить такие методы? Я думаю, что этот метод будет использоваться как в производственных кодексах, так и в тестовых кодах. –

 Смежные вопросы

  • Нет связанных вопросов^_^