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.
[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! 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!
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.