web-dev-qa-db-fra.com

J'ai une gemme installée mais j'ai besoin que 'gemname' ne fonctionne pas. Pourquoi?

La question que je me pose vraiment est de savoir pourquoi require ne prend pas le nom de la gemme. Aussi, dans le cas contraire, quel est le moyen le plus simple de trouver l'incantation secrète pour exiger cette fichue chose?

Par exemple, si memcache-client est installé, je dois le demander à l'aide de

require 'rubygems'
require 'memcache'
59
mloughran

Il n'y a pas de norme pour ce que le fichier que vous devez inclure est. Cependant, il y a certaines conventions couramment suivies que vous pouvez suivre, essayez et utilisez:

  • Souvent, le fichier s'appelle le mêmenom en tant que gem. Donc require mygem Fonctionnera. 
  • Souvent, le fichier est Le seul fichier .rb du sous-répertoire lib De la gem. Ainsi, si vous Pouvez obtenir le nom de la gem pierres précieuses dans un projet Rails antérieur à la version 2.1), vous pouvez alors inspecter #{gemname}/lib pour les fichiers .rb, et s'il n'y en a qu'un, c'est un joli.

Si tout cela fonctionne, alors tout ce que vous pouvez faire est de regarder dans le répertoire du gem (que vous pouvez trouver en exécutant gem environment | grep INSTALLATION | awk '{print $4}' et en cherchant dans le répertoire lib, vous aurez probablement besoin de lire les fichiers et d'espérer un commentaire expliquant quoi faire

38
Laurie Young

Mon système ne semble pas non plus connaître l'existence de RubyGems - à moins que je ne le lui dise. La commande 'require' est écrasée par RubyGems pour pouvoir charger des gems, mais à moins que vous ayez déjà requis RubyGems, il n'a aucune idée de la façon de le faire. Donc, si vous écrivez le vôtre, vous pouvez faire:

require 'rubygems'
require 'gem-name-here'

Si vous utilisez le code de quelqu'un d'autre, vous pouvez le faire en ligne de commande avec:

Ruby -r rubygems script.rb

En outre, il existe une variable d’environnement que Ruby utilise pour déterminer ce qu’elle doit charger au démarrage:

export RUBYOPT=rubygems

(de http://www.rubygems.org/read/chapter/3 . La variable d'environnement m'a été signalée par Orion Edwards )

(Si "require 'rubygems" ne fonctionne pas pour vous, ce conseil est d'une aide limitée :)

47
Atiaxi

Le require doit être mappé sur un fichier dans le chemin de Ruby. Vous pouvez savoir où les pierres précieuses sont installées en exécutant «environnement de pierres précieuses» (recherchez le répertoire d'installation):

kburton@hypothesisf:~$ gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.2.0
  - Ruby VERSION: 1.8.7 (2008-08-08 patchlevel 71) [i686-linux]
  - INSTALLATION DIRECTORY: /usr/local/Ruby/lib/Ruby/gems/1.8
  - Ruby EXECUTABLE: /usr/local/Ruby/bin/Ruby
  - EXECUTABLE DIRECTORY: /usr/local/Ruby/bin
  - RUBYGEMS PLATFORMS:
    - Ruby
    - x86-linux
  - GEM PATHS:
     - /usr/local/Ruby/lib/Ruby/gems/1.8
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :benchmark => false
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - http://gems.rubyforge.org/
kburton@editconf:~$ 

Vous pouvez ensuite rechercher le fichier .rb que vous essayez d'exiger. De plus, vous pouvez imprimer le contenu de $: from irb pour voir la liste des chemins que Ruby va rechercher pour les modules:

kburton@hypothesis:~$ irb
irb(main):001:0> $:
=> ["/usr/local/Ruby/lib/Ruby/site_Ruby/1.8", "/usr/local/Ruby/lib/Ruby/site_Ruby/1.8/i686-linux", "/usr/local/Ruby/lib/Ruby/site_Ruby", "/usr/local/Ruby/lib/Ruby/vendor_Ruby/1.8", "/usr/local/Ruby/lib/Ruby/vendor_Ruby/1.8/i686-linux", "/usr/local/Ruby/lib/Ruby/vendor_Ruby", "/usr/local/Ruby/lib/Ruby/1.8", "/usr/local/Ruby/lib/Ruby/1.8/i686-linux", "."]
irb(main):002:0>
10
Kyle Burton

Les utilisateurs de Rails doivent également penser à redémarrer le serveur Rails après avoir installé une gem

8
lee penkman

Vous devez inclure "rubygems" uniquement si vous avez installé la gemne à l'aide de gem. Sinon, l'incantation secrète consisterait à lancer irb et à essayer différentes combinaisons. En outre, vous pouvez transmettre l'option -I à l'interpréteur Ruby afin d'inclure le répertoire d'installation de la gem, dans LOAD_PATH . Notez que $ LOAD_PATH est un tableau , ce qui signifie que vous pouvez y ajouter des répertoires à partir de votre script.

3
Vhaerun

La question que je me pose vraiment est de savoir pourquoi require ne prend pas le nom de la gemme. 

L'installation d'une gem obtient les fichiers sur votre système. Il ne fait aucune revendication quant à la façon dont ces fichiers seront appelés.
Comme le fait remarquer laurie Il existe plusieurs conventions pour leur désignation, mais rien n’applique cela, et beaucoup d’auteurs de pierres précieuses ne s’y tiennent malheureusement pas.

Aussi, dans le cas contraire, quel est le moyen le plus simple de trouver l'incantation secrète pour exiger cette fichue chose?

Lire la documentation pour votre bijou?
Je trouve que googler pour rdoc gemname trouvera généralement les rdocs officiels de votre gem , qui vous montreront généralement comment l’utiliser.

Memcache n'est peut-être pas le meilleur exemple, car ils supposent que vous l'utiliserez depuis Rails, et le «require» aura déjà été créé pour vous, mais la plupart des autres que j'ai vus ont des exemples montrant le bon incantations

2
Orion Edwards

Un problème que je viens de rencontrer est que la pierre précieuse construite n'incluait pas tous les fichiers qu'elle devrait avoir.

Le problème avec files était qu’il y avait une erreur de syntaxe dans le paramètre gemspec, mais aucune erreur n’a été générée pendant la construction.

Ajoutez simplement ceci ici au cas où quelqu'un d'autre se retrouverait dans le même problème.

1
Gerry

J'ai eu ce problème parce que j'utilise rvm et que j'essayais d'utiliser la mauvaise version de Ruby. La gem en question avait besoin de 1.9.2 et j'avais réglé 2.0.0 comme valeur par défaut! Peut-être une erreur stupide, mais une erreur que quelqu'un d'autre arrivant sur cette page aura probablement faite.

0
Dreyfuzz

Moi aussi j'ai eu ce problème depuis l’installation de OS X Lion et j’ai trouvé que, même si j’exécutais le code suivant, je recevais toujours le message d’avertissement .require 'rubygems'require 'nokogiri'

J'ai essayé de nombreuses solutions postées ici et sur le Web, mais au final, ma solution de contournement consistait simplement à suivre les instructions figurant à http://martinisoftware.com/2009/07/31/nokogiri-on-leopard.html pour réinstaller LibXML & LibXSLT à partir des sources, mais en veillant à ce que la version de LibXML que j'ai installée corresponde à celle attendue par Nokogiri. 

Une fois que j'ai fait cela, les avertissements ont disparu.

0
Matthew O'Riordan

Regardez la source de gem et vérifiez le répertoire lib. S'il n'y a pas de fichier rb, vous devez pointer sur le fichier gem main rb du sous-répertoire:

require 'dir/subdir/file'

pour /lib/dir/subdir/file.rb.

0
hlcs