Require Local File

Я люблю поразбираться в простых, рутинных мелочах, чтобы лучше понимать как мир устроен. Сегодня предлагаю посмотреть на подключение локальных файлов в руби-скриптах.
Допустим у нас есть утилитка, которая выросла в размерах и мы разнесли ее по разным файлам.
# some.rb
module Some
# ...
end
# main.rb
require 'some' # 1. никогда
require './some' # 2. иногда
require File.expand_path('../some', __FILE__) # 3. всегда
1-й вариант не будет работать совсем, так как руби не будет искать файл локально, во 2-м варианте
можно запускать скрипт только из директории, где расположен main.rb
,
3-й вариант работает всегда.
В исходниках я встречал конструкцию $: << '.'
, но не использовал из-за смешного вида. Но даже
смешному коду нужно дать шанс. Код ниже будет запускать только из текущей директории:
$: << '.'
require 'some'
expand_path
будет работать всегда, правда в живой природе не такого не видел:
$: << File.expand_path('..', __FILE__)
require 'some'
Почему же хочется запускать скрипты из другой директории? Рассказываю.
Например во многих репозитариях у
нас есть папка custom
с разными одноразовыми скриптами, которые выкинуть жалко.
Из Рейлс мы запускаем их через rails runner ./custom/some-code.rb
,
чтобы была вся привычная магия и можно было бы вообще не думать.
Но если репозитарий не рейлсовый,
то удобно набрать в корневой папке проекта команду ruby ./custom/some-tricky-file.rb
.
Кейс конечно редкий, но реальный. Поэтому, пожалуй, продолжу и дальше использовать
require File.expand_path('../some', __FILE__)
.