Я работаю над гемом, который должен установить зависимости условно при установке гема.Я немного покопался в
и похоже, что я не одинок в этом.
Rubygems: Как добавить зависимость для конкретной платформы?
это длинная тема
http://www.ruby -forum.com / topic / 957999
Единственный способ увидеть, как добавить зависимости кgem должен использовать метод add_dependency в блоке Gem :: Specifiction в файле .gemspec
Gem::Specification.new do |s|
# ... standard setup stuff
# conditionally set dependencies
s.add_dependency "rb-inotify", "~> 0.8.8" if RUBY_PLATFORM =~ /linux/i
s.add_dependency "rb-fsevent", "~> 0.4.3.1" if RUBY_PLATFORM =~ /darwin/i
s.add_dependency "rb-fchange", "~> 0.0.5" if RUBY_PLATFORM =~ /mswin|mingw/i
end
Основываясь на всех документах и потоках, которые я нашел в сети, я ожидал бы, что если вы установитеgem в
- Linux, тогда rb-inotify будет зависимостью и будет автоматически установлен
- Mac - будет установлен rb-fsevent
- Windows - rb-Будет установлен fchange
Однако, похоже, дело не в этом.Операторы if в блоке оцениваются во время сборки и упаковки гема.Поэтому, если вы собираете и упаковываете гем в Linux, то rb-inotify добавляется как зависимость, Mac, затем rb-fsevent, Windows - rb-fchange.
Все еще нужно решение, я выкопалгде-то в коде rubygems, и кажется, что ниже описывается, что происходит.
- соберите весь свой код для своего гема: foo.gem
- создайте foo.gemspecфайл
- собрать, упаковать и выпустить gem на такой гем-сервер, как rubygems.org
- , чтобы все знали,
- разработчики устанавливают его локально с помощью: gem install foo
- Файл foo.gem загружен, распакован и установлен.все зависимости также установлены.
- все должно быть установлено, и мы можем использовать этот гем.
Кажется, что когда гем собран и выпущен, файл foo.gemspecзагружен, и блок Gem :: Specification оценивается и преобразуется в YAML, сжимается как metadata.gz и включается в foo.gem.Рубиновый код сжимается в data.tar.gz и также включается.Когда гем установлен на локальном компьютере разработчика, YAML извлекается из metadata.gz и преобразуется обратно в блок Gem :: Specification, однако он не преобразуется обратно в исходный блок.
вместо этого,вы увидите что-то вроде следующего:
Gem::Specification.new do |s|
if s.respond_to? :specification_version then
s.specification_version = 3
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
s.add_runtime_dependency(%q<rb-inotify>, ["~> 0.8.8"])
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
else
s.add_dependency(%q<rb-inotify>, ["~> 0.8.8"])
end
end
Хорошо.Таким образом, я имею представление о процессе с высоты птичьего полета, однако это не меняет моего желания создать один гем и условно определять зависимости для целого ряда целей ОС.несколько файлов .gemspec для каждой целевой ОС ... У меня все уши !!