Исполняемый файл Rubygem $LOAD_PATH Проблемы

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

В моем Rubygem есть исполняемый файл с именем "vr". Мне нужно, чтобы этот исполняемый файл "vr" "требовал" всех других файлов из моего проекта.

Когда я занимаюсь разработкой, легко требовать все файлы моего проекта. Я просто "требую" относительный путь к ним, например:

require_all Dir.glob(File.expand_path(File.dirname(__FILE__)) + "/../bin/**/*.rb")

Камень require_all будет отлично работать. Тем не менее, я получаю большую проблему, когда я устанавливаю эту программу как rubygem. Когда мой исполняемый файл "vr" установлен rubygems, он копирует исполняемый файл "vr" в специальный каталог:

/home/eric/.rvm/gems/ruby-1.9.3-p125/bin

Этот каталог полностью отделен от корневой папки моего проекта. И поэтому все файлы моего проекта больше не найдены оператором require.

Rubygems делает этот каталог для корня моего драгоценного камня:

/home/eric/.rvm/gems/ruby-1.9.3-p125/visualruby-0.0.55

Мне нужно иметь возможность "требовать" все файлы из этого каталога в мой проект.

Мое решение до сих пор состоит в том, чтобы создать второй файл с именем "visualruby.rb", который находится в папке lib моего проекта. В нем есть оператор require_all, который требует все файлы проекта. Тогда мне просто нужно связать с ним исполняемый файл, добавив этот код в мой исполняемый файл "vr":

base_file = File.dirname(__FILE__) + '/lib/visualruby.rb'
if File.file?(base_file) 
  require base_file  #load from project
else
  require 'visualruby.rb'  #load from gem
end

Необходимо проверить, существует ли файл с именем "visualruby.rb" относительно текущего файла, потому что, когда я разрабатываю, он всегда найдет версию установленного гема "visualruby.rb", поэтому, когда я изменяю файл, это не имеет никакого эффекта. Я должен заставить его загрузить версию из моего проекта разработки для изменений в работе.

Кроме того, моя IDE создает проекты с нуля, поэтому было бы неплохо узнать общее решение для этого. Я хотел бы иметь согласованную файловую систему для всех проектов, но я не уверен, что это возможно. У меня было общее решение сделать файл с именем "require.rb" для всех проектов, но я не думаю, что он будет работать, потому что каждый проект будет иметь одно и то же имя файла, добавленное в $LOAD_PATH.

Пожалуйста, помогите мне понять, как я могу создать согласованную файловую структуру, в которой я могу разрабатывать, и создавать рубины.

1 ответ

Я нашел ответ на свой вопрос:

Проблема заключалась в том, что я устанавливал свои rubygems с помощью API rubygems:

Gem::Installer.new(file_name)

Это создало системные ссылки, которые испортили мои пути. Существует возможность делать оболочки вместо syslinks, и это кажется стандартным способом установки:

Gem::Installer.new(file_name, :wrappers => true)

Теперь обертка копируется в каталог bin моего гема и использует правильный путь. Теперь у меня есть универсальный файл, который можно превратить в драгоценный камень. И все работает одинаково в разработке и в жемчужине.

Счастливый конец...

Другие вопросы по тегам