Github, gemfile, gemspec - piekło zależności

Witam,

próbuję rozwiązać łamigłówkę z zależnościami zdefiniowanymi w gemspec i gemfile. Nie mogę się z tym uporać. O co chodzi? Mam projekt railsowy, który w zależnościach w gemfile ma definicję:

gem 'my_gem_a', :git => "git://github.com/xxx/my_gem_a.git".

Gem ten dostarcza pewną funkcjonalność, ale także jest zależny od dwóch innych gemów. Zatem w gemspecu do my_gem_a definiuję te zależności:

s.add_dependency('my_gem_b', '~> 0.1') s.add_dependency('my_gem_c', '~> 0.1')
Dodatkowo my_gem_a ma swój gemfile:

[code=ruby]gem “my_gem_b”, “~> 0.1”, git: “git://github.com/xxx/my_gem_b.git”
gem “my_gem_c”, “~> 0.1”, git: “git://github.com/xxx/my_gem_c.git”

gemspec[/code]
Teraz odpalając bundle w moim projekcie dostaję komunikat: “Could not find gem ‘my_gem_b (~> 0.1) ruby’, which is required by gem ‘my_gem_a (>= 0) ruby’, in any of the sources.”
Zarówno my_gem_b, jak i my_gem_c mają swoje pliki gemfile. Wszystkie te zależności są dostępne jedynie na githubie, a nie na rubygems i wolałbym, żeby tak zostało. Pytanie, czy da się tak zrobić, żeby zarówno zależności dla my_gem_a, jak i źródła tych zależności były zdefiniowane w my_gem_a? Chciałbym, żeby dla mojego projektu było to zupełnie przezroczyste i nie musiał się martwić w jaki sposób ma sobie ściągnąć biblioteki od których jest zależny inny gem.

Definiujesz zależność w ramach jednego gema od tak samo nazywających się gemów w dwóch różnych plikach (i do dwóch różnych lokalizacji owego gema), bundler próbuje pogodzić wpisy w gemspecu z tymi w gemfile. Nie dziw się że mu się to nie udaje.

Rozwiązanie: te linijki

gem "my_gem_b", "~> 0.1", git: "git://github.com/xxx/my_gem_b.git" gem "my_gem_c", "~> 0.1", git: "git://github.com/xxx/my_gem_c.git"
wrzuć do Gemfile samej aplikacji railsowej, Bundler powinien sobie już dalej poradzić.

Spoko Tomash, to działa, więc dzięki. Jednak chciałbym uniknąć tego, że w mojej appce railsowej muszę definiować zależności, które jej tak na prawdę nie są potrzebne. Przykładowo: używam w aplikacji devise, w jego zależnościach jest warden, jednak ja tego wardena nie muszę dodawać u siebie w gemfilu. Sytuacja jest analogiczna z tą różnicą, że gemów nie można pobrać z rubygems, ale z githuba. Myślałem, że da się to tak zrobić, że w gemspec definiuję jedynie sam fakt istnienia zależności, a w gemfilu w my_gem_a źródło skąd te zależności pobrać. A w mojej appce po ściągnięciu my_gem_a bundler zajrzy do jego gemfila. Ale widocznie tak to nie działa :confused:

TL;DR jest taki że gemspec nie wspiera gemów ze źródeł typu repozytorium gitowe, więc albo będziesz z tym handlował i umieścisz git-gemy w Gemfile projektu końcowego, albo poprawisz Rubygems, albo postawisz własny gem server dla opartych o te zamknięte gemy projektów.