Я видел два часто используемых метода для добавления каталога файла, который в настоящее время выполняется, в $ 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__)
Есть ли причина выбрать одно вместо другого?
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}
__dir__
(начиная с Ruby 2.0) может сделать любой из них более кратким.Ответы:
Я бы посоветовал
$:.unshift File.dirname(__FILE__)
использовать другой вариант просто потому, что я видел гораздо больше его использования в коде, чем$LOAD_PATH
тот, и он тоже короче!источник
Путь загрузки Ruby очень часто обозначается как $:, но то, что он короткий, не делает его лучше. Если вы предпочитаете ясность уму или если краткость сама по себе вызывает у вас зуд, вам не нужно делать это только потому, что все остальные. Сказать привет ...
... и попрощайся с ...
источник
Я не слишком люблю «быстрый и грязный» путь. Любой новичок в Ruby будет задумываться о том, что это
$:.
такое.Я считаю это более очевидным.
Или, если мне важен полный путь ...
ОБНОВЛЕНИЕ 2009/09/10
В последнее время я делаю следующее:
Я видел это во множестве различных проектов Ruby, просматривая GitHub.
Кажется, условность?
источник
bin
файл, который всегда относился к вашему,code
и он когда-либо запускался толькоbin
файлом ... bootstrap в корзине. Если у вас есть библиотека, то начните загрузку в верхней части кода библиотеки, например,lib/code.rb
чтобы получить доступ ко всему, что находится нижеlib/code/
. Надеюсь, эта прогулка поможет!__dir__
можно использовать для получения пути к каталогу текущего файла.Если вы
script/console
введете свой проект Rails и войдете$:
, вы получите массив, включающий все каталоги, необходимые для загрузки Ruby. Вывод из этого небольшого упражнения$:
- это массив. В этом случае вы можете выполнять с ним функции, такие как добавление других каталогов с помощьюunshift
метода или<<
оператора. Как вы подразумевали в своем заявлении, так$:
и$LOAD_PATH
остались.Недостаток быстрого и грязного способа, как вы упомянули, заключается в следующем: если у вас уже есть каталог на вашем пути загрузки, он повторится.
Пример:
У меня есть созданный мной плагин под названием todo. Моя директория устроена так:
В файле init.rb я ввел следующий код:
Обратите внимание, как я говорю блоку кода выполнять действия внутри блока со строками «модели», «контроллеры» и «модели», где я повторяю «модели». (К вашему сведению,
%w{ ... }
это еще один способ сказать Ruby, что нужно хранить массив строк). Когда я бегуscript/console
, я набираю следующее:И я набираю это так, чтобы было легче читать содержимое строки. Результат, который я получаю:
Как видите, хотя это самый простой пример, который я мог бы создать при использовании проекта, над которым я сейчас работаю, если вы не будете осторожны, быстрый и грязный способ приведет к повторяющимся путям. Более длинный способ проверит повторяющиеся пути и убедится, что они не встречаются.
Если вы опытный программист на Rails, вы, вероятно, очень хорошо представляете, что делаете, и, вероятно, не совершаете ошибку, повторяя пути. Если вы новичок, я бы пошел по более длинному пути, пока вы действительно не поймете, что делаете.
источник
load_paths
иload_once_paths.delete
устарели. Было быActiveSupport::Dependencies.autoload_paths << path
ActiveSupport::Dependencies.autoload_once_paths.delete(path)
Лучшее, что я нашел для добавления каталога через относительный путь при использовании Rspec. Я нахожу это достаточно многословным, но все же приятным.
источник
Есть жемчужина, которая позволит вам настроить путь загрузки с более красивым и чистым кодом. Проверьте это: https://github.com/nayyara-samuel/load-path .
Также есть хорошая документация
источник
Я знаю, что этот вопрос был задан давно, но у меня есть дополнительный ответ, которым я хочу поделиться.
У меня есть несколько приложений Ruby, которые были разработаны другим программистом в течение нескольких лет, и они повторно используют одни и те же классы в разных приложениях, хотя могут обращаться к одной и той же базе данных. Поскольку это нарушает правило DRY, я решил создать библиотеку классов, которая будет использоваться всеми приложениями Ruby. Я мог бы поместить его в основную библиотеку Ruby, но это скроет пользовательский код в общей кодовой базе, чего я не хотел делать.
У меня возникла проблема, связанная с конфликтом имен между уже определенным именем «profile.rb» и классом, который я использовал. Этот конфликт не был проблемой, пока я не попытался создать общую библиотеку кода. Обычно Ruby сначала ищет местоположения приложений, а затем переходит в местоположения $ LOAD_PATH.
Application_controller.rb не смог найти созданный мною класс и выдал ошибку в исходном определении, потому что это не класс. Поскольку я удалил определение класса из раздела app / models приложения, Ruby не смог найти его там и стал искать его в путях Ruby.
Итак, я изменил переменную $ LOAD_PATH, включив в нее путь к каталогу библиотеки, который я использовал. Это можно сделать в файле environment.rb во время инициализации.
Даже с добавлением нового каталога в путь поиска Ruby выдавал ошибку, потому что сначала предпочтительно брал файл, определенный системой. Путь поиска в переменной $ LOAD_PATH в первую очередь ищет пути Ruby.
Итак, мне нужно было изменить порядок поиска, чтобы Ruby нашел класс в моей общей библиотеке до того, как начал поиск во встроенных библиотеках.
Этот код сделал это в файле environment.rb:
Я не думаю, что вы можете использовать какие-либо расширенные конструкции кодирования, представленные ранее на этом уровне, но они отлично работают, если вы хотите что-то настроить во время инициализации в своем приложении. Вы должны сохранить исходный порядок исходной переменной $ LOAD_PATH, когда она добавляется обратно в новую переменную, иначе некоторые из основных классов Ruby будут потеряны.
В файле application_controller.rb я просто использую
и это загружает файлы пользовательской библиотеки для всего приложения, т.е. мне не нужно использовать команды require в каждом контроллере.
Для меня это было решение, которое я искал, и я подумал, что добавлю его к этому ответу, чтобы передать информацию.
источник