Czy możliwe jest posiadanie zależności od gałęzi git wewnątrz mygem.gemspec?
Myślę o czymś podobnym do następującego:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... ale to nie działa.
Czy możliwe jest posiadanie zależności od gałęzi git wewnątrz mygem.gemspec?
Myślę o czymś podobnym do następującego:
gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'
... ale to nie działa.
Odpowiedzi:
Nie jest to możliwe i prawdopodobnie nigdy nie będzie, ponieważ dla RubyGems byłoby raczej ciężko, gdyby twórcy gemów wymagali od użytkowników zainstalowania określonego systemu kontroli wersji, aby uzyskać dostęp do klejnotu. Klejnoty powinny być samowystarczalne z minimalną liczbą zależności, aby ludzie mogli ich używać w jak najszerszym zakresie zastosowań.
Jeśli chcesz to zrobić dla swoich własnych projektów wewnętrznych, proponuję użyć Bundlera, który obsługuje to całkiem dobrze.
EDYTOWAĆ
Według komentatora nie jest to już prawdą. Informacje wstępne zachowane w kontekście historycznym.
Duplikowanie odniesienia do klejnotu w Gemfile i .gemspec wydaje się teraz powodować wyświetlenie ostrzeżenia w programie Bundler, więc ta odpowiedź wydaje się już nie być prawdą.
Nieaktualne informacje
Ten artykuł Yehudy Katza wyjaśnił mi podobne zamieszanie. Mówi się, że do użytku tylko w programowaniu najlepiej jest dodać rzeczy git do pliku gem, ale ten pakiet nadal będzie używał informacji o zależności / wersji z gemspec (wydaje mi się to magiczne, ale ufam Yehuda).
gemspec
tam umieścisz , czyta również z gemspec. Więc kiedy uruchamiasz bundle install
, zakładam (ale nie testowałem), że dzieje się tak, że Bundler instaluje klejnot określony w Gemfile. Ponieważ Bundler już go zainstalował, ten klejnot jest dostępny dla tego klejnotu require
, niezależnie od tego, że nie pochodzi z repozytorium klejnotów. Żadnej magii, tylko Bundler działa jak zwykle.
Po prostu próbowałem rozwiązać ten problem. I właśnie wymyśliłem następujące rozwiązanie (którego nie jestem pewien, czy publikujesz swój klejnot, czy masz prawa do redystrybucji tego klejnotu oauth2).
Uruchom to w swoim klejnocie, który wymaga klejnotu oauth2.
git submodule add git@github.com:lgs/oauth2.git lib/oauth2
Jeśli potrzebujesz innej gałęzi niż domyślna
cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"
W swoim gemspec dodaj to powyżej wymaganej linii wersji
$:.push File.expand_path('../lib/oauth2/lib', __FILE__)
Będziesz także musiał dodać wszystkie zależności uruchomieniowe gem oauth2 do swojego gemspec. Nie wymyśliłem jeszcze sposobu na obejście tego.
To właśnie zrobiłem i działa to dla nas, ponieważ nasz klejnot jest wymagany przez git, więc nie jestem pewien, czy zadziałaby to dla klejnotu opublikowanego w rubygemach.
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
w aplikacji hosta, jeśli instalujesz z github.
Znalazłem dość proste obejście:
Powiedz, że jesteś w projekcie P
i chcesz użyć samodzielnie wykonanego klejnotu, tools
który sam używa klejnotu systemu operacyjnego oauth2
.
Jeśli zrobiłeś łatkę w środku oauth2
i potrzebujesz tej łatki w swoim klejnocie tools
, nie będziesz w stanie naprawić tego problemu w klejnocie zgodnie z zaakceptowaną odpowiedzią .
Możesz jednak doprecyzować żądaną wersję w pliku Gemfile swojego P
projektu i będzie to wersja używana tools
w czasie wykonywania:
gem 'oauth2', github: 'lgs/oauth2'