Как найти путь, на котором установлен 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, правильно?