Исполняемый файл 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 моего гема и использует правильный путь. Теперь у меня есть универсальный файл, который можно превратить в драгоценный камень. И все работает одинаково в разработке и в жемчужине.
Счастливый конец...