Jak mogę określić lokalny klejnot w moim pliku Gemfile?


Odpowiedzi:


539

Wierzę, że możesz to zrobić:

gem "foo", path: "/path/to/foo"

10
Ścieżka zakodowana jest odpowiednia do szybkiej sesji hakowania, ale lokalny klejnot Bloudermilk jest bardziej skuteczny dla projektów pod kontrolą wersji. Pozwala ci ciągle sprawdzać oba projekty - klejnot i projekt za pomocą klejnotu - dzięki czemu inni nie muszą sprawdzać źródła klejnotu ani korzystać z tych samych ścieżek.
mahemoff,

4
Możesz uczynić to nieco czystszym, używając .gitignored dowiązania symbolicznego do lokalnego klejnotu w katalogu projektu - w ten sposób możesz używać kontroli źródła w obu projektach osobno, a inne mogą zrobić to samo bez identycznej struktury katalogów.
Dan

6
Uważaj na wiosnę. Jeśli używasz ścieżki lokalnej dla swojego klejnotu, możesz zauważyć wersje lokalnego klejnotu w pamięci podręcznej, tak jak ja w konsoli Rails. Jeśli nie wygląda na to, że lokalne zmiany klejnotów są odbierane, spróbuj spring stopsprawdzić, czy to rzeczywiście jest problem.
Jason R

1
Dodanie ścieżki lokalnego klejnotu do config / spring.rb wydaje się pomagać w przechwytywaniu zmian lokalnego klejnotu po ponownym uruchomieniu konsoli / serwera.
Jason R

4
O wiele lepszy sposób na zrobienie tego tutaj: rossta.net/blog/…
Cyzanfar

229

Oprócz określenia ścieżki (jak wspomniał Jimmy) możesz również zmusić Bundlera do używania lokalnego klejnotu dla twojego środowiska tylko przy użyciu następującej opcji konfiguracji:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Jest to niezwykle pomocne, jeśli tworzysz obok siebie dwa klejnoty lub klejnot oraz aplikację railsową.

Pamiętaj jednak, że działa to tylko wtedy, gdy już używasz git do swojej zależności, na przykład:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Jak widać w dokumentacji .


Mam z tym problemy, ponieważ używam BUNDLE_PATH(budowanie pakietu do dystrybucji). Robiąc to, co zasugerowałeś lub odpowiedź Jimmy'ego, robi to tylko using, a nie instaluje się w moim BUNDLE_PATHfolderze. Nie byłem w stanie tego rozgryźć, jakaś pomoc?
Automatico

2
Zauważ, że to nie zadziała z gemspec , na dyskusję tutaj .
davetapley

31
Aby wyłączyć zastąpienie lokalne:bundle config --delete local.GEM_NAME
alxndr

Musiałem usunąć dyrektywę wersji z linii klejnotów, aby to zadziałało.
Epigene

4
Jeśli chcesz użyć innej gałęzi rozwoju niż produkcji, musisz także ustawić, w bundle config disable_local_branch_check trueprzeciwnym razie Bundler narzeka na gałąź. Bądź jednak ostrożny, ponieważ kontrole mają powstrzymać wprowadzanie niepoprawnych zatwierdzeń Gemfile.lock. Dokumenty tutaj: bundler.io/v1.12/git.html
Leo

33

Możesz także odwołać się do lokalnego klejnotu za pomocą git, jeśli akurat nad nim pracujesz.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Potem, jeśli to się zmieni, biegnę

bundle exec gem uninstall foo
bundle update foo

Ale nie jestem pewien, czy wszyscy muszą wykonać te dwa kroki.


5
to świetnie, ale nie jest to wygodne, jeśli aktywnie rozwijasz klejnot ... ponieważ musisz zatwierdzić każdą zmianę i bundle uninstall <gem> && bundle install , dla każdej zmiany, którą chcesz odzwierciedlić w swojej aplikacji
Ramses

18

Aby użyć lokalnego repozytorium klejnotów w projekcie Rails, wykonaj następujące czynności:

  1. Sprawdź, czy folder gem jest repozytorium git (polecenie jest wykonywane w folderze gem)

    git rev-parse --is-inside-work-tree
  2. Pobieranie ścieżki repozytorium (polecenie jest wykonywane w folderze gem)

    git rev-parse --show-toplevel
  3. Konfigurowanie lokalnego zastąpienia dla aplikacji railsowej

    bundle config local.GEM_NAME /path/to/local/git/repository

    gdzie GEM_NAMEjest nazwą twojego klejnotu i /path/to/local/git/repositoryjest wynikiem polecenia w punkcie2

  4. W swojej aplikacji Gemfiledodaj następujący wiersz:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Bieganie bundle installpowinno dać coś takiego:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    gdzie GEM_NAMEjest nazwa twojego klejnotu i /path/to/local/git/repositoryod punktu2

  6. Wreszcie uruchom bundle list, nie, gem listi powinieneś zobaczyć coś takiego:

    GEM_NAME (0.0.1 5a68b88)

    gdzie GEM_NAMEjest nazwa twojego klejnotu


Kilka ważnych przypadków, które obserwuję za pomocą:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Wygląda na RubyMineto, że nie pokazuje lokalnych klejnotów jako zewnętrznej biblioteki. Więcej informacji o błędzie można znaleźć tutaj i tutaj
  • Kiedy zmieniam coś w lokalnym klejnocie, aby zostać załadowanym do aplikacji railsowej, powinienem zrobić stop/startserwer railsowy
  • Jeśli zmieniam versionklejnot, stopping/startingserwer Railsów wyświetla błąd. Aby to naprawić, podaję wersję klejnotu w aplikacji Gemfilerailsowej w następujący sposób:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'

0

Możesz odwoływać się do klejnotów za pomocą źródła: source: 'https://source.com', git repository (:github => 'git/url')i ścieżki lokalnej :path => '.../path/gem_name'.
Możesz dowiedzieć się więcej o Gemfiles i tym, jak ich używać w tym artykule.


-4

Jeśli chcesz też gałąź:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

To nie działa, generuje błąd: Only gems with a git source can specify a branch.
KenB
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.