web-dev-qa-db-fra.com

Comment trouver le chemin d'accès a Ruby Gem est installé sur (c'est-à-dire Gem.lib_path c.f. Gem.bin_path)

Gem.bin_path('cucumber', 'cucumber')

Renvoie le chemin du binaire/exécutable. Il semble qu'il n'y ait pas une telle fonction pour retourner le chemin de la bibliothèque. Qui, dans ce cas, renverrait idéalement:

/home/hedge/.rvm/gems/Ruby-1.9.2-p136@bbb-bdd-meta-bdd/gems/cucumber-0.10.0/lib

Ai-je oublié quelque chose ou existe-t-il un moyen simple/unique d'obtenir ces informations?

Mise à jour: Aucune suggestion CLI ou non-stdlib s'il vous plaît.

44
Hedgehog

Le problème avec la réponse cochée est que vous devez "exiger" le rubygem ou cela ne fonctionnera pas. Souvent, cela n'est pas souhaitable, car si vous travaillez avec un joyau exécutable, vous ne voulez pas "l'exiger" ou vous obtiendrez un tas d'avertissements.

Il s'agit d'une solution universelle pour les exécutables et les bibliothèques:

spec = Gem::Specification.find_by_name("cucumber")
gem_root = spec.gem_dir
gem_lib = gem_root + "/lib"

Si vous voulez devenir vraiment technique, il n'y a pas qu'un seul répertoire lib. Le gemspec a un tableau "require_paths" de tous les répertoires à rechercher (ajouté à $ LOAD_PATH). Donc, si vous voulez un tableau des require_paths, utilisez ceci:

gem_lib = gem_root + "/" + spec.require_paths[0]

Pas besoin de bundler.

76
user1182000

Une fois que la gemme a été chargée avec require, vous trouvez le chemin lib à l'aide de Gem.loaded_specs comme suit:

require 'rubygems'
require 'cucumber'
gem_root = Gem.loaded_specs['cucumber'].full_gem_path
gem_lib = File.join(gem_root, 'lib')
23
Guy

Je ne sais pas pourquoi vous faites cela, mais si vous êtes sur la ligne de commande, utilisez gem env.

15
Andrew Grimm

Essayez d'utiliser bundle show cucumber.

Ce qui, en regardant la source du bundler, fait quelque chose comme:

spec = Bundler.load.specs.find{|s| s.name == name }
spec.full_gem_path

Vous êtes en utilisant bundler, non?

4
jonnii