2012-04-12 41 views
17

Có cách nào để biết đường dẫn gốc của đá quý của tôi không? Tôi đang cố gắng để tải một cấu hình mặc định từ một yaml bên trong đường dẫn đá quý. Làm thế nào để có được thư mục gốc đá quý với ruby?Tìm gốc đá quý

Trả lời

26

Với cơ cấu dự án sau:

your_gem/ 
    lib/ 
    your_gem.rb 

Đây là cách tôi sẽ làm điều đó:

# your_gem.rb 

module YourGem 
    def self.root 
    File.expand_path '../..', __FILE__ 
    end 
end 

Ruby 2.0 đã giới thiệu phương pháp Kernel#__dir__; nó cho phép một giải pháp ngắn hơn đáng kể:

# your_gem.rb 

module YourGem 
    def self.root 
    File.dirname __dir__ 
    end 
end 

Nếu bạn cần truy cập vào các thư mục khác, bạn chỉ có thể xây dựng dựa trên root:

module YourGem 
    def self.bin 
    File.join root, 'bin' 
    end 

    def self.lib 
    File.join root, 'lib' 
    end 
end 
+0

Làm việc cho tôi để tham khảo thư mục "tài liệu" của tôi được bao gồm như là một phần của gemspec, nơi sử dụng Rails.root.join ("tài liệu") mặc định không thành công. Cảm ơn! –

+0

Tôi đang sử dụng ruby ​​2.0.0p0 (2013-02-24 revision 39474). 'File.dirname __dir__' không hoạt động đối với tôi. Tôi nhận được lỗi này: 'TypeError: không chuyển đổi ẩn nil thành String'. Xảy ra để biết tại sao? Cảm ơn. –

+0

@ EE33, ['__dir__' được ghi lại để trả về' nil' nếu '__FILE__' cũng là' nil'] (http://www.ruby-doc.org/core-2.0.0/Kernel.html#method -i -__ dir__). Làm thế nào bạn đang chạy kịch bản của bạn? –

6

gem list <gem> -d

Hoặc nếu bạn đang sử dụng bundler:

bundle show <gem>

+0

Trong chính đá quý: tôi đang cố gọi File.load. Gốc đá quý là gì? –

25

Đây là một giải pháp chung cho thực thi và libs. Nó tải đặc điểm kỹ thuật bằng cách sử dụng API Gem, do đó, đường dẫn luôn chính xác:

spec = Gem::Specification.find_by_name("your_gem_name") 
gem_root = spec.gem_dir 
yaml_obj = YAML.load(gem_root + "/file_name.yaml") 
+2

Sử dụng ['File.join'] (http://www.ruby-doc.org/core-2.1 .1/File.html # method-c-join) thay vì chuỗi nối. –

+0

@MatheusMoreira tại sao nó quan trọng? –

+1

'File.join' đảm bảo rằng bạn sử dụng dấu phân cách đường dẫn thích hợp cho Hệ điều hành của bạn, làm cho mã chéo platorm "/" là đặc trưng cho Linux Nhiều phiên bản (tất cả?) của Microsoft Windows sử dụng "\" –

Các vấn đề liên quan