Require Local File

December 4, 2014

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

Допустим у нас есть утилитка, которая выросла в размерах и мы разнесли ее по разным файлам.

# 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__).

comments powered by Disqus