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


83

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

Я думаю примерно следующее:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

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


У меня такая же проблема, за исключением того, что мне нужна зависимость пути, а не зависимость git. Есть ли способ как-то обойти это? Может быть, вставив какой-нибудь хакерский код Ruby где-нибудь в gemspec?
Ajedi32 06

Ответы:


45

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

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


22
... да, но как это сделать?
Лука Г. Соаве

33
Но что, если ваш драгоценный камень будет позже включен в другой драгоценный камень (например, foobar_gem)? Когда foobar_gem хочет разрешить зависимости в вашем геме, не будет ли он смотреть исключительно в файле gemspec?
eremzeit

7
Вы когда-нибудь находили решение этой проблемы, у меня точно такая же проблема?
msaspence

14
@eremzeit & msaspence - поскольку у вас так много голосов, я чувствую себя обязанным ответить. Для этого нет решения, потому что вы делаете это неправильно . Нормально зависеть от репозитория git для одного приложения, использующего Bundler, совершенно неправильно, чтобы выпущенный гем зависел от GitHub или любого другого репозитория исходного кода. Если вы выпускаете гем, все его зависимости также должны быть выпущены как драгоценные камни. Чтобы официальный пакет, такой как драгоценный камень, полагаться на неизданный исходный код, нужно поставить телегу впереди лошади. Пожалуйста, не пытайтесь это сделать .
gtd

23
@gtd Создание гема и выпуск гема на rubygems - это две разные вещи. Возможно, что частный неопубликованный гем имеет собственные частные зависимости. Мне это кажется нормальным. RubyGems, похоже, не подходит для этого варианта использования, но я не уверен, что это неправильно. Просто нечего поддерживать. Я ошибся?
Стивен Кросби

14

РЕДАКТИРОВАТЬ

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

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

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

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


3
Что в этом такого волшебного? Bundler читает только из Gemfile - за исключением того, что если вы вставляете gemspecтуда, он также читает из gemspec. Поэтому, когда вы запускаете bundle install, я предполагаю (но не тестировал), что происходит следующее: Bundler устанавливает гем, указанный в Gemfile. Поскольку Bundler уже установил его, этот гем доступен для гем require, независимо от того, что он был получен не из репозитория гемов. Никакого волшебства, просто Bundler работает как обычно.
Marnen Laibow-Koser

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

7

Я просто пытался решить эту проблему. И я только что придумал следующее решение (в котором я не уверен, публикуете ли вы свой драгоценный камень или имеете право распространять этот драгоценный камень 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.


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

Важно отметить, что если вы это сделаете, вам может потребоваться использовать: gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: trueв вашем хост-приложении, если вы устанавливаете из github.
Джо Эдгар

2

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.