2011-09-07 11 views
12

Mam aplikację Sinatra, która wymaga innego klejnotu, który rozwijam lokalnie. Mam problem z skonfigurowaniem programu Bundler do używania mojego lokalnego kodu gem podczas tworzenia, ale mój kod z klejnotem w produkcji.W jaki sposób Bundler/Gemfile może być skonfigurowany do korzystania z różnych źródeł klejnotów podczas programowania?

Idealnie mógłby zrobić coś takiego, ale Bundler nie pozwalają określić ten sam klejnot dwukrotnie:

# Doesn't work: 
group :development do 
    gem 'awesome', :path => "~/code/awesome" 
end 

group :production do 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

w międzyczasie mam uciekają się do ręcznie vendoring gem & uaktualniające źródło gem w Gemfile za każdym razem, kiedy uruchamiam, co jest dość kłopotliwe. Mój workflow jest taka:

  1. punkt do mojego lokalnego gem w trakcie rozwoju (gem 'awesome', :path => "~/code/awesome")
  2. Gdy wszystko jest gotowe do wdrożenia, rozpakowywanie gem do vendor/gems
  3. aktualizacji Gemfile aby wskazać vendored gem (gem 'awesome', :path => "vendor/gems/awesome-0.0.1")
  4. Run bundle install (zaktualizować Gemfile.lock) Kod
  5. Deploy
  6. Powrót do kroku 1.

Co za kłopot! Chciałbym zrobić coś czystszego niż po prostu napisanie zadań Rake, aby zautomatyzować moją obecną konfigurację.

Jaki jest najlepszy przepływ pracy dla tego scenariusza?

Odpowiedz

2

Najwyraźniej możesz użyć zwykłej Ruby w swoim Gemfile. Według this article możesz ustawić zmienną środowiskową (lub dowolną inną zmienną, którą znalazłem), abyś mógł wybrać wersję klejnotu, którego chcesz użyć.

## based on an ENV variable 
if ENV['RACK_ENV'] == "development" 
    gem 'awesome', :path => "~/code/awesome" 
else 
    gem 'awesome', :path => "vendor/gems/awesome-0.0.1" 
end 

Może to zadziała. Jeśli chcesz sprzedać swój klejnot w toku, możesz zrobić mały skrypt, który ustawi ENV, sprzedawcę i zresetuje ENV. Eh?

+0

Próbowałem tego, co sugeruje ten artykuł wcześniej, i w większości przypadków jest OK. Problem polega na tym, że po uruchomieniu Gemfile.lock odwołuje się do mojego lokalnego klejnotu (zobacz jego ostatnie dwie próbki kodu). Sądzę, że mógłbym lokalnie instalować klejnoty produkcyjne, a następnie wdrożyć lub wykluczyć Gemfile.lock z Git całkowicie ... ale nie jestem pewien, czy któraś z tych opcji jest najlepszą metodą. –

+0

Tak, chcę osiągnąć to samo, ale wydaje się, że nie ma na to sposobu. –

13

Jest to nowa funkcja, która pozwala to zrobić, po prostu specyfing local.gem_name opcji konfiguracyjnych, takich jak:

bundle config local.rack ~/path/to/local/rack 

Zadziała tylko jeśli gem ma repo git i oddział określonej w Gemfile.

Zobacz thr docs Bundler więcej szczegółów: http://bundler.io/v1.3/bundle_config.html

-3

Oto propozycja, których nie udało nam się w pełni pracy (używany do tematu Szprewa i mam problemy z niektórymi stylów od tematu):

group :production do 
     gem 'gemname', '~> 0.1.6', :git => 'git://github.com/foouser/gemname.git' 
end 

group :development do 
     gem 'gemnamedev', :path => '~/path/gemname' # use local version 
end 

Powiel swój plik gemname.gemspec i nazwij go gemnamedev.gemspec i zmień s.name w nim na "gemnamedev".

+0

to nie zadziała. Bundler daje błąd, mówiąc, że nie możesz mieć dwóch klejnotów z różnych źródeł – jakecraige

Powiązane problemy