Могу ли я указать динамические зависимости для моего gem на основе ввода из командной строки?

#ruby #gem #gemspecs

#ruby #rubygems #gemspecs

Вопрос:

Вступление: Я работаю над gem, который по умолчанию извлекает информацию из некоторых XML-данных и выполняет некоторую обработку документа. Я использую nokogiri для анализа XML. Однако я хочу разрешить пользователю самостоятельно анализировать XML и передавать необходимую информацию для запуска моих методов обработки данных, на случай, если они не хотят устанавливать nokogiri или уже проанализировали XML.

Вопрос: Есть ли какой-либо способ разрешить пользователю указывать во время установки gem, что они не хотят устанавливать зависимость nokogiri? Например (здесь очень размашисто),

 gem install crazy_gem --no-nokogiri
  

и в gemspec, возможно, что-то вроде

 Gem::Specification.new do |s|
  ...
  s.add_dependency 'nokogiri' unless Proc.new { install_flags('no-nokogiri') }
  ...
end
  

[править] Я не хочу слишком заострять внимание на приведенном выше коде gemspec, поскольку я знаю, что он не работает — это просто пример того, что я хочу сделать. [/ редактировать]

gem install crazy_gem --ignore-dependencies отлично работает, пока не появятся дополнительные зависимости.

Ответ №1:

Я не думаю, что вы можете делать именно то, что вам нужно, но есть возможное решение, если вы переформулируете то, что делает ваш gem. Вместо gem, который по умолчанию анализирует некоторый XML и обрабатывает данные, но при необходимости позволяет вам передавать предварительно проанализированные данные, как насчет gem, который в основном связан с обработкой, но при необходимости будет анализировать XML для вас (если у вас есть Nokogiri).

Для этого просто исключите Nokogiri из ваших зависимостей gemspec (вы могли бы добавить его как зависимость от разработки или требование).

Внутри вашего кода убедитесь, что вы вызываете только require 'nokogiri' в begin..end блоке с rescue LoadError и обрабатываете его соответствующим образом.

Комментарии:

1. Я полагаю, что вы правы относительно невозможности сделать то, что я изначально хотел, и в зависимости от природы gem это отличный компромисс и определенно то, что следует рассмотреть. Мне также очень нравится идея использования requirements массива.

Ответ №2:

Gemspecs превращаются в статические файлы во время сборки, так что это не сработает. Вы могли бы попробовать использовать -f который обходит проверки зависимостей.