Возможна ли зависимость от ветки git внутри mygem.gemspec?
Я думаю что-то похожее на следующее:
gem.add_runtime_dependency 'oauth2', :git => '[email protected]:lgs/oauth2.git'
... но это не работает.
Возможна ли зависимость от ветки git внутри mygem.gemspec?
Я думаю что-то похожее на следующее:
gem.add_runtime_dependency 'oauth2', :git => '[email protected]:lgs/oauth2.git'
... но это не работает.
Это невозможно, и, вероятно, никогда не будет, потому что для RubyGems было бы довольно тяжело разрешить разработчикам гема требовать, чтобы у пользователей была установлена определенная система контроля версий для доступа к гему. Gems должны быть автономными с минимальным количеством зависимостей, чтобы люди могли использовать их в как можно более широком спектре приложений.
Если вы хотите сделать это для своих собственных внутренних проектов, я бы посоветовал использовать Bundler, который достаточно хорошо это поддерживает.
Gemfile
и файлы зависимостей .gemspec
, добавление локальной или git-ссылки на Gem в вашем Gemfile
сообщит сборщику, где его найти, даже если на него ссылается другой gem. Вам просто нужно убедиться, что у вас есть совместимые спецификации версии.
- person jwadsack; 22.11.2014
gem 'A', git: '[email protected]:myorganization/A.git'
в Gemfile драгоценного камня B, не его .gemspec
- person Matt; 01.02.2017
bundle install
. Что мне не хватает?
- person Nakilon; 26.10.2017
fail
вверху, и ничего не происходит.
- person Nakilon; 26.10.2017
ИЗМЕНИТЬ
По словам комментатора, это уже не так. Предыдущая информация сохранена для исторического контекста.
Дублирование ссылки на драгоценный камень в Gemfile и .gemspec теперь вызывает предупреждающее сообщение в Bundler, поэтому этот ответ больше не соответствует действительности.
Устаревшая информация
Эта статья Иехуды Кац прояснил для меня подобную путаницу. В нем говорится, что для использования только в разработке лучше всего добавить материал git в gemfile, но этот упаковщик по-прежнему будет использовать информацию о зависимости/версии из gemspec (мне это кажется волшебным, но я доверяю Yehuda).
gemspec
, он также будет читать из gemspec. Итак, когда вы запускаете bundle install
, я предполагаю (но не проверял), что происходит то, что Bundler устанавливает гем, указанный в Gemfile. Поскольку Bundler уже установил его, этот драгоценный камень доступен для драгоценного камня require
, независимо от того факта, что он не был получен из репозитория драгоценных камней. Никакой магии, просто Бандлер работает как обычно.
- person Marnen Laibow-Koser; 26.01.2014
Я как раз тоже пытался разобраться с этой проблемой. И я только что придумал следующее решение (которое я не уверен, публикуете ли вы свой драгоценный камень или имеете права на распространение этого драгоценного камня oauth2).
В вашем геме, для которого требуется гем oauth2, запустите это.
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 в ваш gemspec. Я еще не нашел способ обойти это.
Это то, что я сделал, и это работает для нас, потому что наш драгоценный камень требуется через git, поэтому я не уверен, будет ли это работать для опубликованного драгоценного камня rubygems.
gem 'my_gem', git: '[email protected]:me/myrepo', submodules: true
в вашем хост-приложении, если вы устанавливаете из github.
- person Joe Edgar; 08.07.2020
Я нашел обходной путь довольно прямолинейным:
Допустим, вы участвуете в проекте P
и хотите использовать самодельный драгоценный камень tools
, который сам использует драгоценный камень ОС oauth2
.
Если вы сделали патч в oauth2
и нуждаетесь в этом патче в своем геме tools
, вы не сможете исправить эту проблему в геме в соответствии с принятый ответ.
Однако вы можете указать нужную версию в Gemfile вашего проекта P
, и это будет версия, используемая tools
во время выполнения:
gem 'oauth2', github: 'lgs/oauth2'
Я столкнулся с подобной проблемой, и вот что я нашел. Вы не можете добавить ветку git напрямую для какого-либо другого драгоценного камня, однако вы можете добиться этого другим способом. Вы можете определить частный гем со ссылкой на репозиторий и именем ветки в гемфайле вашего пользовательского гем, т.е.
gem 'gem_name', '>=0.1.1', git: 'repository_link ', branch: 'brnach_name'
и запустить bundle install
Теперь вы можете указать его в файле gemspec, не нужно добавлять версию, так как он уже будет выбран из Gemfile.lock.
spec.add_runtime_dependency 'sms_service'
Примечание. Убедитесь, что gemspec
находится внизу Gemfile. Таким образом, он сначала установит необходимые драгоценные камни, а затем добавит их в качестве зависимости к вашему драгоценному камню.
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem 'sms_service', '>=0.1.1', git: 'repository link', branch: 'branch_name'
gemspec