Чи можливо мати залежність 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-матеріали у gem-файл, але цей пакет все одно використовуватиме інформацію про залежність / версію з gemspec (мені здається чарівною, але я довіряю Yehuda).
gemspec
туди введете, він також читає з gemspec. Тож під час запуску bundle install
я припускаю (але не перевіряв), що відбувається те, що Bundler встановлює дорогоцінний камінь, вказаний у Gemfile. Оскільки Bundler його вже встановив, цей самоцвіт доступний для нього require
, незалежно від того, що він надійшов не зі сховища. Ніякої магії, просто Бандлер працює як зазвичай.
Я просто намагався зрозуміти і цю проблему. І я щойно придумав таке рішення (яке я не впевнений, чи публікуєте ви свій дорогоцінний камінь або маєте право на його розповсюдження).
Запустіть це у своєму самоцвіті, для якого потрібен 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__)
Також вам потрібно буде додати всі залежності середовища виконання 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'