2013-12-16 6 views
2

Я построил рубиновый камень с двоичным кодом. Я использую вот так:require_relative от настоящего рабочего каталога

myruby "param" 

Это помощник для интеграции зданий и нуждается в настройке для каждого проекта. У меня есть настройки в settings.rb для нескольких проектов. Возможно ли потребовать файл .rb на основе настоящего рабочего каталога? Когда я бегу:

/home/usr/admin/sources/myproject1/ $ myruby start 

Я хочу, чтобы потребовать настройки из:

/home/usr/admin/sources/myproject1/settings.rb 

Как я мог это сделать, если это возможно? Я пробовал:

require_relative '#{Dir.pwd}/settings.rb' 

который не работал.

+0

Вы используете 'bundler'? –

ответ

3
File.expand_path('../', __FILE__) 

дает вам путь к текущему каталогу. Таким образом, если у вас есть файл в bin/foo, и вы хотите, чтобы требовать что-то в lib/foo/settings.rb просто использовать

require File.join(File.expand_path('../../'), __FILE__), 'lib/foo/settings.rb') 

Обратите внимание на двойную ../, потому что первый требуются вырезать из __FILE__ текущего имени файла.

Если файл находится в /home/usr/admin/sources/myproject1/bin/foo

File.expand_path('../', __FILE__) 
# => /home/usr/admin/sources/myproject1/bin 
File.expand_path('../../', __FILE__) 
# => /home/usr/admin/sources/myproject1 
File.join(File.expand_path('../../', __FILE__), 'lib/foo/settings.rb') 
# => /home/usr/admin/sources/myproject1/lib/foo/settings.rb 

Если вы хотите включить файл с относительным путем от рабочего каталога, используйте

require File.join(Dir.pwd, 'settings.rb') 

Однако, я не думаю, что это хорошая идея жестко закодировать путь таким образом. Возможно, вы захотите передать параметры в качестве аргумента в командной строке.

На самом деле не имеет смысла создавать драгоценный камень, который зависит от пути файла, жестко закодированного на вашем компьютере.

+0

это возвращает «/Library/Ruby/Gems/2.0.0/gems/» к сожалению, потому что я использую свою программу из gem. – Ostkontentitan

+0

Я обновил ответ. –

0

File.expand_path(File.dirname(__FILE__)) вернет каталог относительно файла, из которого вызывается эта команда.
Разница между require и require_relative заключается в том, что require_relative загружает файлы из каталога относительно файла, в котором он написан. В то время как require ищет файлы в каталогах от $LOAD_PATH, если задан относительный путь или может загружать файлы из абсолютного пути, который может быть создан с помощью File.expand_path

+0

Записанный файл находится в каталоге gems, поэтому я получаю в результате «/Library/Ruby/Gems/2.0.0/gems/» вместо «home/usr/admin/sources/myproject1» – Ostkontentitan

+0

Если я правильно понял, вам нужно получить каталог, в котором запущен 'myruby'. Если вы используете Unix, вы можете получить текущий каталог из переменной среды PWD, используя 'ENV ['PWD']' в ruby. – leemour

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