Я работаю над самоцветом, которому необходимо установить зависимости условно, когда камень установлен. Я проделал кое-какие операции вокруг
и похоже, что я не одинок в этой необходимости.
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
Основываясь на всех документах и потоках, найденных в сети, я ожидал, что если вы установите драгоценный камень на
- Linux, тогда rb-inotify будет зависимым и автоматически установленным
- Mac-rb-fsevent будет установлен
- Windows-rb-fchange будет установлен
Однако, похоже, это не так. Операторы "if" внутри блока оцениваются во время создания и упаковки драгоценного камня. Следовательно, если вы создаете и упаковываете драгоценный камень в Linux, тогда rb-inotify добавляется как зависимость, Mac, затем rb-fsevent, Windows-rb-fchange.
Все еще нуждаясь в решении, я выкопался в коде rubygems, и, похоже, следующее - это широкий ответ о том, что происходит.
- постройте весь свой код для своего драгоценного камня: foo.gem
- создать файл foo.gemspec
- построить, пакет и выпустить драгоценный камень на сервер драгоценных камней, например rubygems.org
- пусть все знают
- разработчики устанавливают его локально через: gem install foo
- файл foo.gem загружается, распаковывается и устанавливается. все зависимости также установлены.
- все должно быть установлено, и мы можем попросить использовать драгоценный камень.
Похоже, что когда камень построен и выпущен, файл 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<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
Ok. Тем не менее, у меня есть взгляд на птицу, но это не меняет моего желания построить один драгоценный камень и условно определять зависимости для целого ряда целей ОС.
Если у кого-то есть решение, отличное от создания нескольких файлов .gemspec для каждой целевой ОС... Я все уши!