Я пишу направляющим 3 генератора, но вещи становятся немного сложными, таким образом, я хотел бы извлечь некоторый код для помещения их в отдельный файл.
Таким образом, я создаю файл в папке генератора, и в моем файле генератора, я поместил наверху:
require 'relative/path/to/my/code.rb'
Но когда я запускаю генератор, он говорит мне, что не может найти файл.
activesupport-3.0.0.rc/lib/active_support/dependencies.rb:219:in `require': no such file to load -- relative/path/to/my/code.rb (LoadError)
Кто-либо знает работу вокруг?
Это зависит от того, какую версию Ruby вы используете.
В 1.8 он должен работать так же, как и вы. В 1.9 вы должны использовать require_relative
.
Вы также не должны добавлять ".rb" в конце, это не рекомендуется.
Опасность простого 'require' с относительным путем заключается в том, что если этот сценарий сам требуется другим, тогда путь будет относиться к первому вызываемому сценарию:
rootdir
- main.rb
- subdir1
- second.rb
- subdir11
- third.rb
Если вызывается main.rb, а затем требуется second.rb (с 'subdir1 / second'
), а затем вы хотите потребовать third.rb с 'subdir11 / third.rb'
, он не будет работать.
Вы можете относиться к первому сценарию ( subdir1 / subdir11 / third.rb
), но это не очень хорошая идея.
Вы можете использовать __ FILE __
, а затем сделать его абсолютным путем:
require File.expand_path ('../ subdir11 / third.rb', FILE )
( сначала .. это попасть в каталог, содержащий файл) или
требуется File.dirname ( FILE ) + '/subdir11/third.rb'
Но наиболее распространенной практикой является ссылаться на него из корневого каталога.
В геме вы можете предположить, что корневой каталог находится в $ LOAD_PATH
(или вы можете добавить его самостоятельно).
В Rails вы можете использовать require "# {RAILS_ROOT} / path"
(rails2) или
require Rails.root.join ('path')
(rails3)