Добавление каталога в $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__)

Есть ли какая-нибудь причина идти одна над другой?

Ответ 1

Я бы сказал, перейдите с $:.unshift File.dirname(__FILE__) поверх другого, просто потому, что я видел гораздо больше его использования в коде, чем $LOAD_PATH, и он тоже короче!

Ответ 2

Путь загрузки Ruby очень часто встречается как $:, но только потому, что он короткий, не делает его лучше. Если вы предпочитаете ясность для умения или если краткость для вас самих делает вас зуд, вам не нужно делать это только потому, что все остальные. Поздороваться...

$LOAD_PATH

... и попрощаться с...

# I don't quite understand what this is doing...
$:

Ответ 3

Я не слишком люблю "быстро и грязно". Любой, кто будет знаком с 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.

Кажется, это соглашение?

Ответ 4

Если вы введете 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 

Обратите внимание, как я говорю блоку кода для выполнения действий внутри блока в моделях строк, "контроллеров" и "моделей", где я повторяю "модели". (FYI, %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, у вас, вероятно, есть очень хорошее представление о том, что вы делаете, и, вероятно, не допустите ошибку повторения путей. Если вы новичок, я бы пошел с более длинным путем, пока вы не поймете, что вы делаете.

Ответ 5

Лучший, с которым я столкнулся, для добавления каталога через относительный путь при использовании Rspec. Я нахожу его достаточно подробным, но также приятным лайнером.

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))

Ответ 6

Существует жемчужина, которая позволит вам настроить путь загрузки с помощью более чистого и чистого кода. Проверьте это: https://github.com/nayyara-samuel/load-path.

Он также имеет хорошую документацию