построить рубиновый драгоценный камень и условно указать зависимости.

Я работаю над гемом, которому необходимо установить зависимости условно при установке драгоценного камня. Я немного покопался в

, и похоже, что я не один в этой нужде.

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

. Основываясь на всех документах и ​​потоках, которые я нашел в сети, я ожидал, что если вы установите драгоценный камень на

  • 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, ["~> 0.8.8"])
    else
      s.add_dependency(%q, ["~> 0.8.8"])
    end
  else
    s.add_dependency(%q, ["~> 0.8.8"])
  end

end

Хорошо. Итак, у меня есть взгляд на процесс с высоты птичьего полета, однако это не меняет моего желания создать единый драгоценный камень и условно указать зависимости для ряда целей ОС.

Если у кого-то есть другое решение, кроме создания нескольких файлов .gemspec для каждой целевой ОС ... Я все слышу !!

19
задан Community 23 May 2017 в 12:09
поделиться