GEM Hell

2012-03-22 #ruby

Il y a quelque jours, j'ai fait un gem update pour mettre à jour toutes les gems installées sur mon PC puis un gem cleanup pour supprimer toutes les anciennes versions.

Ce matin, je lance un des anciens projets qui me sert à faire différente essais avec DataMapper et Nokogiri et là c'est le drame...

C:\Ruby\_projets\cinemas> ruby app.rb
C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/dependency.rb:247:in `to_specs': Could not find multi_json (~> 1.0.3) amongst
[RedCloth-4.2.9-x86-mingw32, activesupport-3.2.2, addressable-2.2.7, backports-2.3.0, bcrypt-ruby-3.0.1-x86-mingw32, bui
lder-3.0.0, bundler-1.1.2, configuration-1.3.1, data_mapper-1.2.0, data_objects-0.10.8, diff-lcs-1.1.3, dm-aggregates-1.
2.0, dm-constraints-1.2.0, dm-core-1.2.0, dm-do-adapter-1.2.0, dm-migrations-1.2.0, dm-serializer-1.2.1, dm-sqlite-adapt
er-1.2.0, dm-timestamps-1.2.0, dm-transactions-1.2.0, dm-types-1.2.1, dm-validations-1.2.0, do_sqlite3-0.10.8-x86-mingw3
2, fastercsv-1.5.4, haml-3.1.4, heroku-2.21.3, i18n-0.6.0, json-1.6.5, json_pure-1.6.5, launchy-2.1.0, mail-2.4.4, maruk
u-0.6.0, mime-types-1.18, minitest-2.11.4, monkey-lib-0.5.4, multi_json-1.1.0, nesta-0.9.13, netrc-0.7.1, nokogiri-1.5.2
-x86-mingw32, polyglot-0.3.3, pony-1.4, rack-1.4.1, rack-flash-0.1.2, rack-protection-1.2.0, rack-test-0.6.1, rake-0.9.2
.2, rdiscount-1.6.8, rdoc-3.12, rest-client-1.6.7, rspec-2.9.0, rspec-core-2.9.0, rspec-expectations-2.9.0, rspec-mocks-
2.9.0, rubygems-update-1.8.20, rubyzip-0.9.6.1, sass-3.1.15, shotgun-0.9, sinatra-1.3.2, sinatra-advanced-routes-0.5.1,
sinatra-reloader-0.5.0, sinatra-sugar-0.5.1, sqlite3-1.3.5-x86-mingw32, stringex-1.3.2, syntax-1.0.0, term-ansicolor-1.0
.7, tilt-1.3.3, treetop-1.4.10, uuidtools-2.1.2] (Gem::LoadError)
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:777:in `block in activate_dependencies'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:766:in `each'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:766:in `activate_dependencies'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:750:in `activate'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:780:in `block in activate_dependencies'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:766:in `each'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:766:in `activate_dependencies'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb:750:in `activate'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems.rb:211:in `rescue in try_activate'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems.rb:208:in `try_activate'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:59:in `rescue in require'
    from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
    from app.rb:8:in `<main>'

Il semblerait donc que Ruby Could not find multi_json (~> 1.0.3) amongst toutes les gems que j'ai sur mon ordinateur. Alors que j'ai la gem multi_json-1.1.0 installée. Normal, c'est pas la même version.

Comme je commence à m'habituer à Ruby, je sais maintenant qu'il faut faire comme avec Oracle et regarder à la fin de la pile d'erreur pour savoir qu'est-ce qui a provoqué ce problème :

from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:59:in `rescue in require'
from C:/Ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
from app.rb:8:in `<main>'

Ma ligne 8 :

require "data_mapper"

En fouillant bien, il semblerait que dm-types (le plugin DataMapper qui permet d'avoir des types de données supplémentaires) a une dépendance avec multi-json 1.0.3 (cf dm-types.gemspec)

J'installe donc la vieille version de multi_json en faisant un voeu (c'est la 1° fois que j'utilise -v) :

C:\Ruby> gem install multi_json -v 1.0.3
Fetching: multi_json-1.0.3.gem (100%)
Successfully installed multi_json-1.0.3
1 gem installed
Installing ri documentation for multi_json-1.0.3...
Installing RDoc documentation for multi_json-1.0.3...

Je relance mon application :

C:\Ruby> cd .\_projets\cinemas
C:\Ruby\_projets\cinemas> ruby app.rb
[2012-03-22 08:06:59] INFO  WEBrick 1.3.1
[2012-03-22 08:06:59] INFO  ruby 1.9.2 (2011-02-18) [i386-mingw32]
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick
[2012-03-22 08:06:59] INFO  WEBrick::HTTPServer#start: pid=5072 port=4567

Ça tiendra jusqu'à mon prochain gem cleanup. Mais sinon, c'est peut être pour éviter ce genre de problème qu'il y a Bundler ?