Я работаю над гемом, которому необходимо установить зависимости условно при установке драгоценного камня. Я немного покопался в
, и похоже, что я не один в этой нужде.
Rubygems: Как мне добавить зависимости, зависящие от платформы?
http://www.ruby-forum.com/topic/957999
Единственный способ, которым я могу помочь Добавление зависимостей в гем - это использование метода 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
. Основываясь на всех документах и потоках, которые я нашел в сети, я ожидал, что если вы установите драгоценный камень на
Однако, похоже, что это не так. дело. Операторы «if» внутри блока оцениваются во время сборки и упаковки драгоценного камня. Следовательно, если вы собираете и упаковываете гем в Linux, тогда rb-inotify добавляется как зависимость, Mac, затем rb-fsevent, Windows - rb-fchange.
Все еще нуждаясь в решении, я покопался в коде rubygems и, похоже, следующее представляет собой общее представление о том, что происходит.
Похоже, что когда гем построен и выпущен, файл foo.gemspec загружается, а блок Gem :: Specification оценивается и преобразуется в YAML, сжатый как metadata.gz и включен в foo.gem. Код Ruby сжимается в 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, ["~> 0.8.8"])
else
s.add_dependency(%q, ["~> 0.8.8"])
end
else
s.add_dependency(%q, ["~> 0.8.8"])
end
end
Хорошо. Итак, у меня есть взгляд на процесс с высоты птичьего полета, однако это не меняет моего желания создать единый драгоценный камень и условно указать зависимости для ряда целей ОС.
Если у кого-то есть другое решение, кроме создания нескольких файлов .gemspec для каждой целевой ОС ... Я все слышу !!