"require File.dirname (__ FILE__)" - как безопасно отменить зависимость файловой системы? - PullRequest
11 голосов
/ 25 июня 2009

Некоторые библиотеки Ruby, которые я использую, используют 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 Ответ

10 голосов
/ 25 июня 2009

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

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

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

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

  1. добавление параметров -I в командной строке ruby ​​
  2. изменение переменной $ LOAD_PATH в источниках
  3. игра с переменной среды RUBYLIB

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

@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 не рекомендуется, чем меньше у вас зависимостей от переменных среды, тем лучше вы будете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...