Как найти путь, на котором установлен Ruby Gem (т.е. Gem.lib_path c.f. Gem.bin_path)

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

Вернет двоичный/исполняемый путь. Кажется, нет такой функции, чтобы возвращать путь библиотеки. Что в этом случае, в идеале, вернется:

/home/hedge/.rvm/gems/[email protected]/gems/cucumber-0.10.0/lib

Я что-то пропустил или есть простой/единственный способ получить эту информацию?

Обновлено: нет предложений CLI или non-stdlib.

Ответ 1

Проблема с проверенным ответом заключается в том, что вы должны "потребовать" rubygem, иначе он не будет работать. Часто это нежелательно, потому что если вы работаете с исполняемым камнем, вы не хотите "требовать" его, или вы получите кучу предупреждений.

Это универсальное решение для исполняемых файлов и libs:

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

Если вы хотите получить действительно технический, существует не только один каталог lib. У gemspec есть массив "require_paths" всех каталогов для поиска (добавлен в $LOAD_PATH). Итак, если вам нужен массив require_paths, используйте это:

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

Нет необходимости связывать.

Ответ 2

После того, как камень был загружен с требованием, вы найдете путь lib, используя Gem.loaded_specs, следующим образом:

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

Ответ 3

Я не уверен, почему вы это делаете, но если вы находитесь в командной строке, используйте gem env.

Ответ 4

Попробуйте использовать bundle show cucumber.

Который, глядя на источник связки, делает что-то вроде:

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

Вы используете bundler, правильно?