Nie mogę używać gemów po instalacji przez Bundlera

Witam
Uczę się Railsów z książki dostępnej pod adresem railstutorial.org. Z niej zrozumiałem, że wydanie polecenia ‘bundler install’ zastępuje 'gem install '.
Wykonuję więc:

[code]└─┤09:06 |$├─> bundle install
(ciach)
Using annotate-models (1.0.4)
(ciach)
Your bundle is complete! Use bundle show [gemname] to see where a bundled gem is installed.

Your bundle was installed to .[/code]
Niestety, po próbie uruchomienia annotate z katalogu ruby/1.9.1/bin

└─┤09:08 |$├126─> ruby/1.9.1/bin/annotate ~/.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 annotate-models (>= 0) (Gem::LoadError) from ~/.rvm/rubies/ruby-1.9.2-rc2/lib/ruby/site_ruby/1.9.1/rubygems.rb:214:in `activate' from /~/.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 ruby/1.9.1/bin/annotate:18:in `<main>'
Jednak, gdy zainstaluję gema annotate-models poleceniem

gem install annotate-models

polecenie ruby/1.9.1/bin/annotate
wykonuje się bez szemrania i dopisuje co trzeba do modelu.
Używam bundler 1.0.0.rc.2, rails 3.0.0.rc, ruby 1.9.2dev (2010-07-11 revision 28618), RVM obecne.
Czy źle pojmuję filozofię bundlera, czy to coś innego?

Chyba źle pojmujesz filozofię bundlera. ON jest już dla aplikacji np. railsowych, w których wywołujesz polecenie parsujące Gemfile, a nie dla “binarnych” gemów. Ale jestem zbyt pijany by to dokładnie opisac.

Fajnie jednak, gdyby na forum znalazła się trzeźwa osoba, która by mi wytłumaczyła sprawę, bo szukając informacji w internecie nie napotykam nigdzie na porównanie “gem install …” z “bundle install”, co mogłoby mnie naprowadzić na rozwiązanie problemu. Aha, annotate uruchamiam z dokładnej ścieżki, bo w /usr/bin/ już siedzi binarka o nazwie annotate z pakietu “gd”, którego pozbyć się nie mogę.

W tej sytuacji używaj gem install.
Bundle będzie Ci potrzebny wyłącznie do aplikacji railsowych.

Oraz: jedno nie zastępuje drugiego! Bundler najlepiej (najszybciej) pracuje wtedy, kiedy gem w danej wersji jest już zainstalowany w systemie właśnie poleceniem gem install.

aby “pozbyć” się annotate z /usr/bin w ~/.bashrc:

export PATH=/opt/ruby/bin:$PATH

oczywiście /opt/ruby/bin zastąp ścieżką, gdzie leżą binarki z instalowanych gemów

Klika dni temu Czak, opisał Bundlera na Rubysferze: http://rubysfera.pl/2010/08/warte-uwagi-bundler/
Tekst powinien trochę rozjaśnić.

Nieprawda. Możesz używać bundlera z dowolnymi programami w Rubym, które korzystają z gemów.

Olek, litości.
Kolega dopiero zaczyna z Rubym.

Daj mu najpierw pójść najprostszym rozwiązaniem (systemowe gemy) i dopiero potem, jak zobaczy jego ograniczenia i utrudnienia, podrzuć Bundlera.

[quote=Tomash]Olek, litości.
Kolega dopiero zaczyna z Rubym.

Daj mu najpierw pójść najprostszym rozwiązaniem (systemowe gemy) i dopiero potem, jak zobaczy jego ograniczenia i utrudnienia, podrzuć Bundlera.[/quote]
Jak mało kiedy zgadzam się w 100% z Tomashem :). Przecież jeszcze niedawno bundler nie istniał i jakoś żyliśmy, ba, nawet budowaliśmy duże aplikacje i działały!:slight_smile: Do nauki rubiego czy też pisania aplikacji dla siebie bundler nie jest konieczny.

Dzięki za punkt zaczepienia! Przeczytałem artykuł i w oczy rzuciło mi się jedno zdanie:

Wytłuszczone zdanie zdaje się nie odnosić do mojej konfiguracji, może tu leży błąd.

To w takim razie ktoś po rozpakowaniu mojej aplikacji powinien najpierw zerknąć do pliku Gemfile po zależności, wykonać gem install <gemy> i potem dopiero uruchomić Bundlera?
Zadam jeszcze jedno pytanie: czy Bundlera można traktować jako menadżera zależności podobnego do np. pacmana?

Możesz Bundlera uruchomić od razu, ale wtedy będzie on przy bundle install zaciągał i budował gemy. Lepiej (wygodniej) mieć owszem, te gemy już poinstalowane.

Arch Linux user warning! :smiley:

Nie. Odpowiednikiem pacmana jest właśnie gem.
Z tą różnicą, że pacman zawsze trzyma jedną wersję danego programu, natomiast gem pozwala Ci mieć w systemie ten sam gem w wielu wersjach. I to jest właśnie źródło problemów (kiedy nowsza wersja gema rozwala kompatybilność ze starszą, pod którą napisałeś aplikację).

Bundler powstał z wielu powodów, ale jego największa praktyczna zaleta jest taka, że pozwala zmusić Twoją aplikację do korzystania z jednej ściśle określonej wersji danego gema (oraz z jednego ściśle określonego zestawu gemów), więc nawet zainstalowanie w systemie niekompatybilnej innej (nowszej) wersji tego gema zupełnie nie dotyczy aplikacji korzystającej z bundlera.

Najbliższa *nixowa analogia do aplikacji z bundlerem to konta użytkowników, z których każdy w swoim $HOME instaluje sobie takie aplikacje i w takich wersjach, w jakich chce, dzięki czemu aplikacje (wersje) nie przeszkadzają tym z innego konta.

Also: Radarek się ze mną zgadza, uciekajmy! :smiley:

Ok, teraz jasne. Dzięki za pomoc.

Spróbuj

bundle exec annotate

Skrót myślowy czy serio tak uważasz?

Skrót myślowy. Nie prependowałem "Na tym etapie przygody z Ruby "

I oczywiście ‘bundle exec annotate’ wykonuje robotę jak trzeba. Dzięki ponownie.