Ruby Gemspec Bağımlılığı: Git dalı bağımlılığı olabilir mi?


84

Mygem.gemspec içinde git şube bağımlılığı olabilir mi?

Aşağıdakine benzer bir şey düşünüyorum:

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

... ama işe yaramıyor.


Git bağımlılığı değil, yol bağımlılığı istemem dışında aynı sorunu yaşıyorum. Bunu bir şekilde aşmanın bir yolu yok mu? Belki bir yerdeki gemspec'e biraz hackish Ruby kodu yapıştırarak?
Ajedi32

Yanıtlar:


45

Bu mümkün değildir ve büyük olasılıkla RubyGems'in gem geliştiricilerinin, kullanıcıların bir gem'e erişmek için belirli bir sürüm kontrol sistemine sahip olmalarını talep etmelerine izin vermesi oldukça ağır bir iş olacağı için mümkün değildir. Taşlar, minimum sayıda bağımlılıkla bağımsız olmalıdır, böylece insanlar bunları olabildiğince geniş bir uygulama dizisinde kullanabilir.

Bunu kendi iç projeleriniz için yapmak istiyorsanız, önerim bunu oldukça iyi destekleyen Bundler'ı kullanmanız olacaktır .


22
... evet, ama bunu nasıl yapabilirim?
Luca G. Soave

33
Peki ya cevheriniz daha sonra başka bir cevherde yer alacaksa (örn. Foobar_gem)? Foobar_gem geminizdeki bağımlılıkları çözmek istediğinde, yalnızca gemspec dosyasında görünmeyecek mi?
eremzeit

7
Hiç buna bir çözüm buldunuz mu, bende de tam olarak aynı sorun var mı?
msaspence

14
@eremzeit & msaspence - çok fazla olumlu oyunuz olduğundan, yanıt vermeye mecbur hissediyorum. Bunun çözümü yok çünkü yanlış yapıyorsun . Bundler kullanan tek bir uygulama için bir git deposuna güvenmek sorun değil, serbest bırakılan bir gem'in GitHub'a veya başka herhangi bir kaynak kodu deposuna bağlı olması tamamen yanlıştır. Bir mücevher yayınlıyorsanız, tüm bağımlılıkları da mücevher olarak serbest bırakılmalıdır. Bir mücevher gibi resmi bir paket yapmak, yayınlanmamış kaynak koduna güvenmek, arabayı atın önüne koymaktır. Lütfen bunu yapmaya çalışmayın .
gtd

23
@gtd Bir mücevher yaratmak ve yakut taşlara bir mücevher bırakmak iki ayrı şeydir. Yayınlanmamış özel bir mücevherin kendine ait özel bağımlılıkları olması mümkündür. Bu bana güzel görünüyor. RubyGems bu kullanım durumuna uygun görünmüyor, ancak bunun yanlış yaptığına ikna olmadım. Destekleyecek pek bir şey yok. Yanlış mıyım?
Stephen Crosby

14

DÜZENLE

Bir yorumcuya göre, bu artık doğru değil. Önceki bilgiler, tarihsel bağlam için saklandı.

Gemfile ve .gemspec'teki bir mücevher referansını çoğaltmak artık Bundler'da bir uyarı mesajı veriyor gibi görünüyor, bu nedenle bu yanıt artık doğru görünmeyecektir.

Güncel olmayan bilgiler

Yehuda Katz'ın bu makalesi benim için benzer bir kafa karışıklığını ortadan kaldırdı. Yalnızca geliştirmede kullanmak için en iyisi git öğelerini gem dosyasına eklemektir, ancak bu paketleyici yine de gemspec'teki bağımlılık / sürüm bilgilerini kullanacaktır (bana büyülü görünüyor, ancak Yehuda'ya güveniyorum).


3
Bunda bu kadar büyülü olan ne? Bundler yalnızca Gemfile'dan okur gemspec- oraya koyarsanız , gemspec'ten de okur. Bu yüzden koştuğunuzda bundle install, (ama test etmedim) olan şeyin Bundler'ın Gemfile'da belirtilen gem'i yüklemesi olduğunu varsayıyorum. Bundler zaten yüklediğinden beri, requirebir gem deposundan gelmemiş olmasına bakılmaksızın , bu gem gem tarafından kullanılabilir . Sihir yok, sadece Bundler her zamanki gibi çalışıyor.
Marnen Laibow-Koser

2
Gemfile ve .gemspec'teki bir mücevher referansının çoğaltılması artık Bundler'da bir uyarı mesajı veriyor gibi görünüyor, bu yüzden bu cevap artık doğru görünmüyor ...
Andy Jones

7

Ben de bu sorunu çözmeye çalışıyordum. Ve şimdi aşağıdaki çözümü buldum (cevherinizi yayınladığınızdan veya oauth2 geminizi yeniden dağıtma hakkınız olup olmadığından emin değilim).

Oauth2 gem gerektiren geminizde bunu çalıştırın.

git submodule add git@github.com:lgs/oauth2.git lib/oauth2

Varsayılandan farklı bir şubeye ihtiyacınız varsa

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

Gemspec'inizde bunu gerekli sürüm satırınızın üstüne ekleyin

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

Ayrıca oauth2 gem'in tüm çalışma zamanı bağımlılıklarını gemspec'inize eklemeniz gerekir. Henüz bunun bir yolunu bulamadım.

Yaptığım şey buydu ve bizim için işe yarıyor çünkü bizim cevherimiz git üzerinden gereklidir, bu yüzden bunun bir rubygems yayınlanmış mücevher için işe yarayıp yaramayacağından emin değilim.


Her iki cevheri de yazdıysanız ve her ikisi de aktif geliştirme aşamasındaysa, bağımlılığı bir alt modül olarak eklemek doğru çözümdür.
Benjineer

Önemlisi, bunu yaparsanız gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true, github'dan yüklüyorsanız, ana bilgisayar uygulamanızda kullanmanız gerekebilir .
Joe Edgar

2

Oldukça basit bir çözüm buldum:

Bir projede olduğunuzu Pve kendi toolsbaşına bir işletim sistemi mücevheri kullanan kendi kendine yapılan mücevheri kullanmak istediğinizi söyleyin oauth2.

İçinde bir yama yaptıysanız oauth2ve bu yamayı mücevherinizde kullanmanız gerekiyorsa tools, bu sorunu kabul edilen cevaba göre mücevherde düzeltemezsiniz .

Bununla birlikte, istediğiniz sürümü Pprojetinizin Gemfile dosyasında söyleyebilirsiniz ve bu tools, çalışma zamanında tarafından kullanılan sürüm olacaktır :

gem 'oauth2', github: 'lgs/oauth2'

İşte benim gerçek hayattan bir örnek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.