Возможно ли иметь зависимость ветки git внутри mygem.gemspec?
Я думаю примерно следующее:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... но это не работает.
Возможно ли иметь зависимость ветки git внутри mygem.gemspec?
Я думаю примерно следующее:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... но это не работает.
Ответы:
Это невозможно и, скорее всего, никогда не будет, потому что для RubyGems было бы довольно жестоко разрешать разработчикам гемов требовать, чтобы у пользователей была установлена определенная система контроля версий для доступа к гемам. Драгоценные камни должны быть автономными с минимальным количеством зависимостей, чтобы люди могли использовать их в максимально широком диапазоне приложений.
Если вы хотите сделать это для своих собственных внутренних проектов, я бы посоветовал использовать Bundler, который хорошо это поддерживает.
РЕДАКТИРОВАТЬ
По словам комментатора, это уже не так. Предварительная информация сохранена для исторического контекста.
Дублирование ссылки на драгоценный камень в Gemfile и .gemspec теперь вызывает предупреждающее сообщение в Bundler, поэтому этот ответ больше не соответствует действительности.
Устаревшая информация
Эта статья Иегуды Каца прояснила для меня аналогичную путаницу. В нем говорится, что для использования только в разработке лучше всего добавить материал git в gemfile, но этот сборщик по-прежнему будет использовать информацию о зависимости / версии из gemspec (мне кажется волшебным, но я доверяю Иегуде).
gemspec
туда, он также читает из gemspec. Поэтому, когда вы запускаете bundle install
, я предполагаю (но не тестировал), что происходит следующее: Bundler устанавливает гем, указанный в Gemfile. Поскольку Bundler уже установил его, этот гем доступен для гем require
, независимо от того, что он был получен не из репозитория гемов. Никакого волшебства, просто Bundler работает как обычно.
Я просто пытался решить эту проблему. И я только что придумал следующее решение (в котором я не уверен, публикуете ли вы свой драгоценный камень или имеете право распространять этот драгоценный камень oauth2).
В вашем геме, который требует gem oauth2, запустите это.
git submodule add git@github.com: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__)
Также вам нужно будет добавить все зависимости времени выполнения gem oauth2 в ваш gemspec. Я еще не придумал способ обойти это.
Это то, что я сделал, и это работает для нас, потому что наш гем требуется через git, поэтому я не уверен, сработает ли это для опубликованного драгоценного камня rubygems.
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
в вашем хост-приложении, если вы устанавливаете из github.
Я нашел довольно простой обходной путь:
Допустим, вы участвуете в проекте P
и хотите использовать самодельный гем, tools
который сам использует гем ОС oauth2
.
Если вы сделали патч внутри oauth2
и вам нужен этот патч в своем геме tools
, вы не сможете исправить эту проблему в геме в соответствии с принятым ответом .
Однако вы можете указать нужную вам версию в P
Gemfile вашего проекта , и эта версия будет использоваться tools
во время выполнения:
gem 'oauth2', github: 'lgs/oauth2'