How to find the path a Ruby Gem is installed at (i.e. Gem.lib_path c.f. Gem.bin_path)

前端 未结 4 1933
灰色年华
灰色年华 2020-12-24 01:24
Gem.bin_path(\'cucumber\', \'cucumber\')

Will return the binary/executable\'s path. It seems there is no such function to return the library path.

相关标签:
4条回答
  • 2020-12-24 01:33

    After the gem has been loaded with require, you find the lib path using Gem.loaded_specs as follows:

    require 'rubygems'
    require 'cucumber'
    gem_root = Gem.loaded_specs['cucumber'].full_gem_path
    gem_lib = File.join(gem_root, 'lib')
    
    0 讨论(0)
  • 2020-12-24 01:50

    I'm not sure why you're doing this, but if you're on the command line, use gem env.

    0 讨论(0)
  • 2020-12-24 01:51

    The problem with the checked answer is that you must "require" the rubygem or it won't work. Often this is undesireable because if you're working with an executable gem, you don't want to "require" it or you'll get a bunch of warnings.

    This is a universal solution for executables and libs:

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

    If you want to get really technical, there isn't just one lib directory. The gemspec has a "require_paths" array of all the directorys to search (added to $LOAD_PATH). So, if you want an array of the require_paths, use this:

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

    No need for bundler.

    0 讨论(0)
  • 2020-12-24 01:51

    Try using bundle show cucumber.

    Which, from looking at the source of bundler does something like:

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

    You are using bundler, right?

    0 讨论(0)
提交回复
热议问题