Ruby on Rails: bundle exec alebo aktualizovať rake?

Problém: rake aborted

Komu sa to už stalo? Púšťam v rails projekte takýto rake príkaz a zrazu:

$ rake db:migrate

rake aborted!
Gem::LoadError: You have already activated rake 12.0.0,
but your Gemfile requires rake 11.3.0.
Prepending `bundle exec` to your command may solve this.

Riešenie: bundle exec

Áno, toto je známe, navyše to radí aj chybová hláška – stačí pridať na začiatok bundle exec a pustiť príkaz znova:

$ bundle exec rake db:migrate

Potom to už ide. Bundle exec prikáže použiť verziu gemu uvedenú v Gemfile.lock projektu.

Dá to aj inak? Aktualizujeme verziu

Chybovej hlášky sa vieme zbaviť aj tak, že si v projekte aktualizujeme verziu gemu rake 😀

Verzie všetkých gemov sú „locknuté“ v súbore v Gemfile.lock, ktorý sa nachádza v každom rails projekte. Ak chceme aktualizovať tento súbor v rails projekte, needitujeme ho ručne, ale editujeme buď Gemfile alebo používame podpríkazy bundleru. My teraz použijeme podpríkaz bundleru:

$ bundle update rake

Tento príkaz aktualizuje iba jeden gem (prípadne závislosti) a zapíše sa to do spomínaného Gemfile.lock. Počas behu príkazu v termináli je možné vidieť podobný výstup tomuto (vy máte možno úplne iné verzie, to je ok):

Resolving dependencies....
Using rake 12.0.0 (was 11.3.0)    <---- tu
Using i18n 0.7.0
Using json 1.8.3
Using minitest 5.8.4
...

A potom to ide už aj bez bundle exec, pustím tento príkaz a som v pohode:

$ rake db:migrate

# a nasleduje jedna moja nezbehnutá migrácia...

== 20170802081750 AddStudioToCharge: migrating ================================
-- add_reference(:charges, :studio, {:index=>true, :foreign_key=>true})
-> 0.0433s
== 20170802081750 AddStudioToCharge: migrated (0.0433s) =======================

Cez git diff navyše môžem vidieť, že sa v Gemfile.lock čosi naozaj zmenilo:

$ git diff

diff --git a/Gemfile.lock b/Gemfile.lock
index e333d66..d79276b 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -324,7 +324,7 @@ GEM
activesupport (= 4.2.5.1)
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
-    rake (11.3.0)
+    rake (12.0.0)    <---- tu
rb-fsevent (0.9.7)
rb-inotify (0.9.7)
ffi (>= 0.5.0)

Ktorý spôsob je lepší? bundle exec je úplne bežný postup, no ak mám minútku čas, zvážim aj aktualizáciu gemu a urobím to (ak sa niečo pokázi, vždy môžem napísať git reset --hard :-))

Pozri aj tento článok, ak ťa zaujíma ako si napísať vlastný rake task.

Ďakujem za čítanie.