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 => '[email protected]: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 => '[email protected]: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.
źródło
EDYTOWAĆ
Według komentatora nie jest to już prawdą. Informacje wstępne zachowane w kontekście historycznym.
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).
źródło
gemspec
tam umieścisz , czyta również z gemspec. Więc kiedy uruchamiaszbundle 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 klejnoturequire
, 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.
źródło
gem 'my_gem', git: '[email protected]: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 operacyjnegooauth2
.Jeśli zrobiłeś łatkę w środku
oauth2
i potrzebujesz tej łatki w swoim klejnocietools
, 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żywanatools
w czasie wykonywania:gem 'oauth2', github: 'lgs/oauth2'
Oto mój przykład z życia.
źródło