2012-01-01 20 views
15

Tak więc rozwijam Sinatrę zarówno dla systemu Windows, jak i dla systemu Linux. Problem polega na tym, że używam Thin zamiast Webrick, a eventmachine dla Windows działa tylko z wersją przedpremierową, podczas gdy Linux używa najnowszej stabilnej. w gemfile ty oczywiście nie może zawierać ten sam klejnot z różnymi wersjami tak:Używanie bundler do ładowania różnych wersji klejnotów dla różnych platform

gem "eventmachine", "~> 1.0.0.beta.4.1", :group => :development_win 
gem "eventmachine", group => :development_linux 
gem "thin 

Zastanawiałem się, czy istnieje sposób, aby obejść ten problem, być może za pomocą jednego gemfile dla okien i jedną gemfile dla systemów Linux, co byłoby polecenie, aby załadować jeden lub drugi.

Alternatywnie istnieje sposób na to, żeby w git zarządzać tylko gemfile dla dwóch różnych platform, być może poprzez gałąź dla samego pliku (nie wiem, czy to możliwe z tego, co przeczytałem o gałęziach git).

Odpowiedz

20

Można to zrobić tak:

# Windows 
gem "eventmachine", "~> 1.0.0.beta.4.1", :platform => [:mswin, :mingw] 

# C Ruby (MRI) or Rubinius, but NOT Windows 
gem "eventmachine", :platform => :ruby 

pełna lista dostępnych platformach:

ruby  C Ruby (MRI) or Rubinius, but NOT Windows 
ruby_18 ruby AND version 1.8 
ruby_19 ruby AND version 1.9 
ruby_20 ruby AND version 2.0 
mri  Same as ruby, but not Rubinius 
mri_18 mri AND version 1.8 
mri_19 mri AND version 1.9 
mri_20 mri AND version 2.0 
rbx  Same as ruby, but only Rubinius (not MRI) 
jruby  JRuby 
mswin  Windows 
mingw  Windows 'mingw32' platform (aka RubyInstaller) 
mingw_18 mingw AND version 1.8 
mingw_19 mingw AND version 1.9 
mingw_20 mingw AND version 2.0 

można znaleźć więcej informacji w Gemfile(5) człowieka stronie here (patrz ' Sekcja platform).

Innym podejściem jest użycie RUBY_PLATFORM Constant:

if RUBY_PLATFORM =~ /win32/ 
    gem "eventmachine", "~> 1.0.0.beta.4.1" 
else 
    gem "eventmachine" 
end 

Nie widziałem pełną listę dostępnych wartości dla RUBY_PLATFORM ale można uruchomić

ruby -e 'puts RUBY_PLATFORM' 

na obu swoich platformach i zobaczyć różnicę .

+3

hmm, pierwsze rozwiązanie rzuca ten sam błąd o dwóch gemach określonych w gemfile. Warunkowa instrukcja działa poprawnie. – indigo0086

+6

Drugie podejście jest nieprawidłowe, ponieważ przechowuje jedną lub inną wersję klejnotu w pliku 'Gemfile.lock'. Nie może przechowywać obu. Jeśli więc przygotujesz 'Gemfile.lock' na maszynie dev systemu Win32, a potem wdrożysz ją na Linuksie, otrzymasz tę samą błędną wersję. Dlatego nadal szukam prawidłowego rozwiązania. –

+1

Podejście platformowe działa dobrze pod warunkiem, że tylko różne (nazwane) klejnoty są potrzebne dla różnych platform, możliwe jest nawet zatwierdzenie pliku Gemfile.lock i utrzymanie go w stabilny sposób (inaczej niż w przypadku podejścia innego). – prusswan

3

Możesz użyć opcji --gemfile, aby użyć różnych plików gem dla różnych platform. Zobacz dokumentację tutaj http://gembundler.com/man/bundle-config.1.html

+0

zakładam: 1. „różnych gemfiles” masz na myśli "inny" Gemfile's "(nie" inne pliki gem "); i 2.przez '--gemfile' masz na myśli konfigurację' gemfile' w zmiennej środowiskowej 'BUNDLE_GEMFILE' lub w pliku' .bundle/config' (w katalogach domowych deweloperów). W ten sposób program Bundler może bezpiecznie tworzyć np. 'Gemfile-linux.lock' oraz' Gemfile-windows.lock'. – MarkDBlackwell

0

Potrzebujesz wielu wersji (wszystkie o tej samej nazwie) klejnotu. W związku z tym, obecnie w pakiecie Bundler, potrzebujesz wielu, jednoczesnych plików "blokady" zależnych od programu Bundler. Jest to możliwe, jeśli twoi programiści wykorzystają ustawienia konfiguracyjne Bundler'a gemfile. Mogą to zrobić albo:

  1. Poprzez wykorzystanie zmiennej środowiskowej BUNDLE_GEMFILE (w linii poleceń lub w .bash_profile); lub
  2. (Prawdopodobnie mniej celowo) w .bundle/config (globalnie, w ich katalogach domowych).

Tak więc, bezpiecznie, Bundler może tworzyć (i prawdopodobnie automatycznie później używać, z tymi samymi ustawieniami konfiguracji), np. Gemfile-linux.lock i Gemfile-windows.lock.

Chociaż to podstawowe podejście wydaje się wykonalne, nie jest ono zbyt suche. Jednak ta poprawia jeśli np zarówno Gemfile-linux i Gemfile-windows automatycznie włączać niezależnie Gemfile oświadczenia dzielą wspólną cechę: to znaczy, jeśli zawierają one oświadczenie:

::Kernel.eval(File.open('Gemfile-common','r'){|f| f.read},::Kernel.binding)

+0

Dzięki za odpowiedź, ale ja nie używałem Rubiego od lat, ale jestem pewien, że odpowiedź w 2012 roku była zadowalająca. – indigo0086

Powiązane problemy