"require File.dirname(__ FILE__)" - как безопасно отменить зависимость файловой системы?

Некоторые Ruby librararies Я использую следующие выражения require:

require File.dirname(__FILE__) + '/specification_helper.rb'

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib"))

require File.join(File.dirname(__FILE__), 'lib/tools', 'version')

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn'))

Разве этот формат не делает ваш код ненужным в зависимости от структуры файловой системы?

Почему автор сделал это так?

Можно ли (безопасно) изменить этот код, чтобы удалить эту зависимость от файловой системы?

Ответ 1

Я действительно использую эту схему в производственном коде.

Требования к файлам относительно текущего местоположения источника имеют несколько преимуществ:

  • исходное дерево может перемещаться в целом и остается пригодным для использования, поскольку нам требуются источники относительно друг друга.
  • поскольку мы используем полные пути, мы избегаем случайных коллизий (загрузка источника с тем же именем в другой библиотеке или перезагрузка одного и того же источника дважды)
  • код можно использовать без изменения пути поиска ruby ​​

Если вы предпочитаете использовать измененный путь поиска Ruby, вы можете сделать это несколькими способами:

  • добавление опций -I в командной строке ruby ​​
  • изменение переменной $LOAD_PATH в источниках
  • игра с переменной окружения RUBYLIB

Решение 1 подразумевает управление вызовом ruby. Для запуска программы вам понадобится script, например:

@echo off
REM my_script.cmd
set srcdir=%~dp0\..\path\to\source
ruby -I %srcdir% %srcdir%\my_script.rb

Или:

#!/bin/sh
srcdir=$(cd $(dirname $0)/../path/to/source && pwd)
exec ruby -I $srcdir $srcdir/my_script.rb

Решение 2 работоспособно, но не исключает столкновений. Обычно вы будете делать что-то вроде:

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))

Решение 3 нецелесообразно, чем меньше зависимостей вы будете иметь к переменным среды, тем лучше вы будете.