Tôi biết bạn có thể làmlập trình xác định con đường đá quý bằng cách sử dụng bundler
bundle show gem_name
để hiển thị đường dẫn của một số đá quý.
Bạn làm điều đó từ bên trong mã bằng cách sử dụng đối tượng Bundler như thế nào?
Tôi biết bạn có thể làmlập trình xác định con đường đá quý bằng cách sử dụng bundler
bundle show gem_name
để hiển thị đường dẫn của một số đá quý.
Bạn làm điều đó từ bên trong mã bằng cách sử dụng đối tượng Bundler như thế nào?
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
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.
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ưatốt hơn, bạn có thể sử dụng trực tiếp
0.123.Bundler::CLI#locate_gem
: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"
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. –