Добавление каталога в $ LOAD PATH (Ruby)
Я видел два часто используемых метода добавления каталога файла, который в настоящее время выполняется в $LOAD_PATH (или $:). Я вижу преимущества этого в случае, если вы не работаете с драгоценным камнем. Одно кажется более многословным, чем другое, очевидно, но есть ли причина идти с одним над другим?
первый, подробный метод (может быть перебор):
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) unless $LOAD_PATH.include?(File.expand_path(File.dirname(__FILE__)))
и более простой, быстрый и грязный:
$:.unshift File.dirname(__FILE__)
никаких оснований идти с одним над другим?
6 ответов
Я бы сказал, пойти с $:.unshift File.dirname(__FILE__)
над другим, просто потому, что я видел гораздо больше использования его в коде, чем $LOAD_PATH
один, и он тоже короче!
путь загрузки Ruby очень часто рассматривается как$:, но только потому, что он короткий, не делает его лучше. Если вы предпочитаете ясность уму, или если краткость сама по себе вызывает зуд, вам не нужно делать это только потому, что все остальные таковы. Привет ...
$LOAD_PATH
... и попрощаться ...
# I don't quite understand what this is doing...
$:
Я не слишком люблю "быстрый и грязный" путь.
Любой новичок в Ruby будет размышлять, что $:.
- это.
Я нахожу это более очевидным.
libdir = File.dirname(__FILE__)
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
или если я забочусь о том, чтобы иметь полный путь...
libdir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
обновление 2009/09/10
в последнее время я делаю следующее:
$:.unshift(File.expand_path(File.dirname(__FILE__))) unless
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
Я видел его в целом ряде различных проектов ruby во время просмотра GitHub.
кажется, что конвенция?
если ты типа script/console
в вашем проекте Rails и введите $:
, вы получите массив, который включает в себя все каталоги, необходимые для загрузки Ruby. Вывод из этого маленького упражнения таков:--5--> - это массив. При этом вы можете выполнять на нем функции, такие как добавление других каталогов с помощью unshift
способ или <<
оператора. Как вы подразумевали в своем заявлении $:
и $LOAD_PATH
то же самое.
недостаток это быстрый и грязный способ как вы упомянули, это так: если у вас уже есть каталог в пути загрузки, он повторится.
пример:
у меня есть плагин, который я создал под названием todo. Мой каталог структурирован следующим образом:
/---vendor | |---/plugins | |---/todo | |---/lib | |---/app | |---/models |---/controllers | |---/rails | |---init.rb
в init.RB файл я ввел следующий код:
## In vendor/plugins/todo/rails/init.rb
%w{ models controllers models }.each do |dir|
path = File.expand_path(File.join(File.dirname(__FILE__), '../lib', 'app', dir))
$LOAD_PATH << path
ActiveSupport::Dependencies.load_paths << path
ActiveSupport::Dependencies.load_once_paths.delete(path)
end
обратите внимание, как я говорю блоку кода выполнять действия внутри блока для строк "модели", "контроллеры" и "модели", где я повторяю "модели". (К ВАШЕМУ СВЕДЕНИЮ, %w{ ... }
- это еще один способ сказать Ruby, чтобы держать массив строк). Когда я бегу script/console
, Я набираю следующее:
>> puts $:
и я набираю это, чтобы было легче читать содержимое в строке. Вывод, который я получаю:
... ... ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/controllers ./Users/Me/mySites/myRailsApp/vendor/plugins/todo/lib/app/models
как вы можете видеть, хотя это простой пример, который я мог бы создать при использовании проекта, над которым я сейчас работаю, если вы не будете осторожны, быстрый и грязный путь приведет к повторным путям. Более длинный путь проверит для повторите пути и убедитесь, что они не происходят.
если вы опытный программист Rails, у вас, вероятно, есть очень хорошее представление о том, что вы делаете, и, вероятно, не совершите ошибку повторения путей. Если вы новичок, я бы пошел более длинным путем, пока вы не поймете, что вы делаете.
лучше всего я столкнулся для добавления dir через относительный путь при использовании Rspec. Я нахожу его достаточно многословным, но все же приятным.
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
есть драгоценный камень, который позволит вам настроить свой путь загрузки с более приятным и чистым кодом. Проверьте это:https://github.com/nayyara-samuel/load-path.
Она также имеет хорошую документацию