Rvm i bundler

Witam
Postanowiłem zainstalować wersję ruby z gita, więc wydałem polecenie ‘rvm install ruby-head’. Chciałem też, żeby ta wersja była domyślną dla przyszłych shelli, zatem kazałem też ‘rvm --default use ruby-head’. Tak więc zadowolony uruchamiam konsolę z projektem rails 3.0.0 i ‘rails s’. No i tu niemiła niespodzianka, bo skrypt wyrzuca

/home/bartek/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/site_ruby/1.9.1/rubygems.rb:779:in `report_activate_error': Could not find RubyGem rails (>= 0) (Gem::LoadError) from /home/bartek/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/site_ruby/1.9.1/rubygems.rb:214:in `activate' from /home/bartek/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/site_ruby/1.9.1/rubygems.rb:1082:in `gem' from <internal:gem_prelude>:213:in `push_gem_version_on_load_path' from <internal:gem_prelude>:16:in `gem' from /usr/bin/rails:18:in `<main>'
Czego mi może w konfiguracji brakować, że to nie chce działać?

Zrobiłeś

bundle install

w katalogu aplikacji? Nie jestem pewien, ale może brakuje Ci po prostu gemów w nowej wersji Rubiego.

Właśnie, wiedziałem, że czegoś nie dopowiedziałem. Po kolei. bundle install
instaluje gemy do katalogu projektu, co nie jest zbyt użyteczne, bo rails s
dalej rzuca taki sam błąd. Próbowałem zmigrować gemy poleceniem rvm migrate ruby-1.9.2-rc2 ruby-head
ale to powoduje taki ruch I/O, że proces kswapd0 zajmuje 100% mocy CPU i potrzeba hard-reseta, co jest ewidentnym bugiem w kernelu. Na razi jestem w kropce.

A co mówi gem -v?

U mnie w podobnej sytuacji pomogło skasowanie rubygems.rb (tzn. oczywiście przemianowanie go na jakieś tam rubygems.bak). W sumie już nie pamiętam dlaczego ale miało to jakieś racjonalne wytłumaczenie…

└─┤06:43 |$├─> gem -v 1.3.7
Zastanawiające jest jeszcze jedno. Dlaczego do czorta system korzysta z katalogu ruby-1.9.2-rc2 gdy powinien korzystać już z ruby-head. Nie ogarniam tego całego rvma, choć muszę przyznać, że bez niego byłoby jeszcze ciężej :slight_smile:
Po rubygems.rb -> rubygems.rb.bak

<internal:gem_prelude>:158:in `require': no such file to load -- rubygems (LoadError) from <internal:gem_prelude>:158:in `load_full_rubygems_library' from <internal:gem_prelude>:212:in `push_gem_version_on_load_path' from <internal:gem_prelude>:16:in `gem' from /usr/bin/rails:18:in `<main>'
Chyba nie jest lepiej.

Musiałem coś strasznie namieszać, bo doinstalowałem gem ‘rails’, potem jeszcze ‘ZenTest’, o którego pluł się autotest, i poszło.

Jeśli nie powiodła się migracja gemów to używając już ruby-head zainstaluj brakujące gemy korzystając z bundle install (bundler domyślnie instaluje gemy w tej samej ścieżce co “gem install”).
Aby zachować porządek możesz później usunąć nieużywaną już wersję rubiego.

No właśnie sęk w tym, że u mnie bundler instaluje je w katalogu projektu, a nie w drzewie RVM. W tym leżał cały problem. Właśnie odkryłem, że można wydać polecenie bundle install --system
, o czym poinformował mnie sam bundler. Ładnie z jego strony. Problem rozwiązany.

Nie śledziłem rozwoju Bundlera od początku, ale obecnie stosowaną praktyką (i polecaną przez twórców Bundlera) jest dodawanie do systemu kontroli wersji wyłącznie plikow Gemfile i Gemfile.lock (same gemy trzymamy poza katalogiem projektu).

Taką też praktykę sobie przyswoiłem.

Zemści się, kiedy serwer z danym gemem będzie niedostępny w momencie instalacji.

@Arsen7

Nie zemści się. Po pierwsze jak często instalujesz aplikację? Podpowiedź - rzadko.
Po drugie jak często pada rubygems / gemcutter? Podpowiedź - jw.

W praktyce nie ma z tym problemu :slight_smile:

[quote=phocke]@Arsen7

Nie zemści się. Po pierwsze jak często instalujesz aplikację? Podpowiedź - rzadko.
Po drugie jak często pada rubygems / gemcutter? Podpowiedź - jw.

W praktyce nie ma z tym problemu :)[/quote]
A jednak :wink:

Pamiętam jak kilka miesięcy temu coś dziwnego były jakieś jazdy z rubygems i z niektórych serwerów nie można było się w ogóle połączyć. I trzeba było tłumaczyć klientowi, że padł serwis, z którego korzystają prawie wszyscy programiście rubiego i nie można zrobić deployu.

Myślę, że raz na kilka miesięcy to akceptowalna częstotliwość :wink:

A Ty drogus jak do tego podchodzisz? Zawsze ściągasz biblioteki do projektu ie. => “bundle package” ??

[quote=phocke]Myślę, że raz na kilka miesięcy to akceptowalna częstotliwość :wink:

A Ty drogus jak do tego podchodzisz? Zawsze ściągasz biblioteki do projektu ie. => “bundle package” ??[/quote]
Zależy od projektu. Na niektórych nawet mi się nie chce zmieniać domyślnych ustawień :wink:

W tym momencie ustawiałbym coś takiego dla ważnych projektów - szczególnie jeżeli wymagane są częste deploye. Dla mniej ważnych tak jak napisałeś: problem w praktyce nie istnieje :wink: