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


84

Чи можливо мати залежність git-гілки всередині mygem.gemspec?

Я думаю щось подібне до наступного:

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

... але це не працює.


У мене така сама проблема, за винятком того, що я хочу залежність шляху, а не залежність git. Чи немає способу якось обійти це? Може, вклеївши десь якийсь хакерський код Ruby в gemspec?
Ajedi32

Відповіді:


45

Це неможливо, і, ймовірно, ніколи не буде, тому що RubyGems було б досить жорстким, щоб дозволити розробникам дорогоцінних каменів вимагати, щоб користувачі мали встановлену спеціальну систему контролю версій для доступу до самоцвіту. Самоцвіти повинні бути автономними з мінімальною кількістю залежностей, щоб люди могли використовувати їх у якомога більш широкому спектрі застосувань.

Якщо ви хочете зробити це для власних внутрішніх проектів, я б запропонував використовувати Bundler, який це досить добре підтримує.


22
... так, але як я можу це зробити?
Luca G. Soave

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

7
Ви коли-небудь знаходили рішення цієї проблеми? У мене точно така ж проблема?
msaspence

14
@eremzeit & msaspence - оскільки у вас так багато голосів, я відчуваю необхідність відповісти. Цього рішення немає, бо ви робите це неправильно . Чудово залежати від репозиторію git для однієї програми, що використовує Bundler, абсолютно неправильно, що випущений gem залежить від GitHub або будь-якого іншого сховища вихідного коду. Якщо ви випускаєте дорогоцінний камінь, усі його залежності також повинні бути випущені як самоцвіти. Щоб зробити офіційний пакет, такий як дорогоцінний камінь, покладайтесь на невипущений вихідний код - це поставити візок перед конем. Будь ласка, не намагайтеся це зробити .
gtd

23
@gtd Створення дорогоцінного каменя та випуск його на рубімах - це дві окремі речі. Можливо, що приватний неопублікований самоцвіт має власні приватні залежності. Мені це здається добре. Здається, RubyGems не відповідає цьому випадку, але я не впевнений, що це робить неправильно. Просто не так багато, щоб це підтримати. Я помиляюся?
Стівен Кросбі,

14

РЕДАГУВАТИ

На думку коментатора, це вже неправда. Попередня інформація, збережена для історичного контексту.

Дублювання посилання на самоцвіт у Gemfile та .gemspec тепер, схоже, викликає попереджувальне повідомлення в Bundler, тому ця відповідь, здається, більше не відповідає дійсності.

Застаріла інформація

Ця стаття Єгуди Кац прояснила для мене подібну плутанину. Там сказано, що для використання лише в розробці найкраще додати git-матеріали у gem-файл, але цей пакет все одно використовуватиме інформацію про залежність / версію з gemspec (мені здається чарівною, але я довіряю Yehuda).


3
Що в цьому чарівного? Bundler читає лише з Gemfile - за винятком того, що якщо ви gemspecтуди введете, він також читає з gemspec. Тож під час запуску bundle installя припускаю (але не перевіряв), що відбувається те, що Bundler встановлює дорогоцінний камінь, вказаний у Gemfile. Оскільки Bundler його вже встановив, цей самоцвіт доступний для нього require, незалежно від того, що він надійшов не зі сховища. Ніякої магії, просто Бандлер працює як зазвичай.
Marnen Laibow-Koser

2
Дублювання посилання на самоцвіт у Gemfile та .gemspec тепер, схоже, викликає попереджувальне повідомлення в Bundler, тож ця відповідь, здається, вже не відповідає дійсності ...
Енді Джонс,

7

Я просто намагався зрозуміти і цю проблему. І я щойно придумав таке рішення (яке я не впевнений, чи публікуєте ви свій дорогоцінний камінь або маєте право на його розповсюдження).

Запустіть це у своєму самоцвіті, для якого потрібен 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.


Додавання залежності як підмодуля є правильним рішенням, якщо ви є автором обох самоцвітів, і обидва вони перебувають у активній розробці.
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.