2012-02-17 6 views

Trả lời

15

Hãy nhìn vào cách họ làm điều đó trong cli.rb

def locate_gem(name) 
    spec = Bundler.load.specs.find{|s| s.name == name } 
    raise GemNotFound, "Could not find gem '#{name}' in the current bundle." unless spec 
    if spec.name == 'bundler' 
    return File.expand_path('../../../', __FILE__) 
    end 
    spec.full_gem_path 
end 
0

Yup, cli.rb là cách tốt nhất để xem xét. Tuy nhiên bạn vẫn phải tìm một tên của spec.

tôi có thể cung cấp cho bạn một điểm khởi đầu, nhưng bạn phải đi kèm với một số giải pháp về cách để tối ưu hóa cho trường hợp của bạn:

 

    GemSearcher = Gem::GemPathSearcher.new 
    Init = GemSearcher.init_gemspecs() 
    GemSearcher.lib_dirs_for(Init[0]) 

Đáng tiếc là giải pháp này cung cấp tìm kiếm vô danh như tất cả Gems đang ở trong một mảng thay vì băm, nhưng nếu bạn muốn bạn có thể hack GemPathSearcher, tôi nghĩ điều đó sẽ hữu ích trong tương lai.

13

Cập nhật: bắt đầu với Bundler v1.3.0, có một công giao diện để đạt được con đường của Gem:

Bundler.rubygems.find_name('json').first.full_gem_path 
# => "/opt/src/foo/my_app/vendor/bundle/ruby/2.0.0/gems/json-1.8.0" 

Pre-v1.3.0, bạn có thể muốn sử dụng giải pháp ban đầu chia sẻ (một giao diện tin):

chưa

tốt hơn, bạn có thể sử dụng trực tiếp Bundler::CLI#locate_gem:

0.123.
require "bundler/cli" 
Bundler::CLI.new.send(:locate_gem, "json") 
# => "/opt/src/foo/my_app/vendor/bundle/ruby/1.9.1/gems/json-1.7.3" 
+1

Xem xét nó không phải là một phần của API (là phương pháp riêng tư), bạn sẽ không đảm bảo rằng nó sẽ thay đổi, vì vậy có thể bị gián đoạn khi Bundler được cập nhật. –