Добавление в каталог в $Path нагрузки (Рубин)
Я видел два часто используемых метода для добавления каталога файла, который в настоящее время выполняется в $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. Вынос из этого маленького упражнения заключается в том, что$:- это массив. Таким образом, вы можете выполнять на нем функции, такие как добавление других каталогов с помощью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.
Она также имеет хорошую документацию
Comments