Ruby Gemspec Dependency: Возможно ли иметь зависимость от git ветки?

Возможно ли иметь зависимость ветки git, внутри mygem.gemspec?

Я думаю что-то похожее на следующее:

gem.add_runtime_dependency 'oauth2', :git => '[email protected]:lgs/oauth2.git'

... но он не работает.

Ответ 1

Это невозможно, и, вероятно, никогда не будет, потому что RubyGems будет довольно жестко позволять разработчикам гемов требовать, чтобы у пользователей была установлена конкретная система контроля версий для доступа к гему. Драгоценные камни должны быть автономными с минимальным количеством зависимостей, чтобы люди могли использовать их в максимально широком диапазоне приложений.

Если вы хотите сделать это для своих собственных внутренних проектов, я бы предложил использовать Bundler, который достаточно хорошо это поддерживает.

Ответ 2

ИЗМЕНИТЬ

По словам комментатора, это уже не так. Предварительная информация сохраняется для исторического контекста.

Дублирование ссылки на жемчужину в Gemfile, и теперь gemspec поднимает предупреждающее сообщение в Bundler, поэтому этот ответ кажется более недействительным.

Устаревшая информация

Эта статья в статье Иегуды Кац разъяснила мне такую ​​путаницу. В нем говорится, что для использования только в разработке лучше всего добавить материал git в gemfile, но этот поставщик по-прежнему будет использовать информацию о зависимости/версии от gemspec (кажется мне магическим, но я доверяю Yehuda).

Ответ 3

Я просто пытался понять эту проблему. И я только что придумал следующее решение (которое я не уверен, если вы публикуете свой камень или имеете право перераспределять этот камень oauth2).

В вашем драгоценном камне, для которого требуется oauth2 gem, выполните это.

git submodule add [email protected]:lgs/oauth2.git lib/oauth2

Если вам нужна другая ветка, чем по умолчанию

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

В вашем gemspec добавьте это выше вашей строки с требуемой версией

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

Также вам нужно будет добавить все зависимости от времени выполнения oauth2 gem к вашему gemspec. Я еще не понял пути.

Это то, что я сделал, и это работает для нас, потому что наш драгоценный камень требуется через git, поэтому я не уверен, что это будет работать для опубликованного драгоценного камня rubygems.

Ответ 4

Я нашел обходной путь довольно прямо:

Допустим, вы участвуете в проекте P и хотите использовать самодельный камень tools, который сам использует камень ОС oauth2.

Если вы сделали патч в oauth2 и нуждаетесь в этом патче в своем геме tools, вы не сможете исправить эту проблему в геме в соответствии с принятым ответом.

Однако вы можете указать нужную версию в своем проекте P Gemfile, и эта версия будет использоваться tools во время выполнения:

gem 'oauth2', github: 'lgs/oauth2'

Вот мой реальный пример из жизни.