2012-05-03 80 views
5

Câu hỏi này là về bundler, rubygems & làm cách nào nó tìm ra phương pháp nào tôi đang gọi. Nó khá dài, vì vậy hãy chịu với tôi.Trình bundler hoạt động như thế nào?

Theo hiểu biết của tôi, Bundler là một công cụ quản lý phụ thuộc để quản lý đá quý cho ruby. Nó cài đặt tất cả các đá quý & phụ thuộc của chúng được liệt kê trong Gemfile.

Câu hỏi tôi muốn hỏi có thể được minh họa rõ nhất bằng ví dụ. vì vậy đây -> Trong ứng dụng ray của tôi, tôi đang làm điều này trong bộ điều khiển của tôi: -

module SurveyorControllerCustomMethods 
    def create 
    super 
    end 
end 
class SurveyorController < ApplicationController 
    include Surveyor::SurveyorControllerMethods 
end 

Ở đây, tôi đang làm hai điều:

  1. Bao gồm SurveyorControllerMethods từ đá quý Surveyor.
  2. Như tôi đã sử dụng siêu ở đây, nó sẽ gọi create phương pháp từ SurveyorControllerMethods mà làm việc tốt nhưng tôi không hiểu nó.

và đá quý được lắp đặt tại

$ bundle show surveyor 
/home/gaurish/.rvm/gems/ruby-1.9.3-p194/gems/surveyor-0.22.0 

nào đáng ngạc nhiên là không có mặt trong ruby ​​của $LOAD_PATH. câu hỏi như vậy là:

  1. thậm chí nó hoạt động như thế nào?
  2. Cài đặt một viên ngọc bằng cách sử dụng trình bao, điều gì xảy ra sau hậu trường trong quá trình cài đặt?
  3. có một số đá quý cũ jquery-rails mà chúng tôi thậm chí không phải bao gồm/gọi chúng trong mã của chúng tôi &, tệp JavaScript jQuery được tự động đưa vào. Tôi biết nó không phải là phép thuật, vậy nó hoạt động như thế nào?

Trả lời

2

Khóa chính là cách Rails được thiết lập ra khỏi hộp. Đó cũng là một trong những lý do Rails quá chậm để bắt đầu các dự án lớn hơn. [1]

Trong boot.rb bạn sẽ tìm thấy:

require 'bunder/setup' 

và ở phía trên cùng của application.rb bạn sẽ tìm thấy:

Bundler.require(:default, :development) 

gọi phương thức cuối cùng này nhìn lại để Gemfile của bạn, sau đó lặp lại tất cả của những viên đá quý nằm trong các nhóm đã cho (:default:development ở trên). Sau đó nó sẽ mất một đâm xác định những gì các tập tin mặc định là nên được nạp, mà thường là tên đá quý, nhưng cũng có thể được chỉ định bởi một tùy chọn :require. Bundler cũng có một số ngoại lệ quy ước đặt tên dựng sẵn, chẳng hạn như việc xử lý "-" thay vì "_".

Bundler sau đó chỉ tải tệp chính cho đá quý, lần lượt (thường) tải các tệp bên trong đá quý.

Tệp 'bundler/setup' thực hiện Bundler.setup, sẽ đảm nhiệm đường dẫn tải. Nó prepends (unshifts) để $LOAD_PATH cho mỗi đá quý.Các thông tin thực tế về những gì những đường dẫn tải nên được đến từ rubygems.

Hãy nhìn vào các nguồn tin trong:

https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb https://github.com/carlhuda/bundler/blob/master/lib/bundler/runtime.rb

[1]: Khi bạn bắt đầu một dự án Rails mới, có thể bạn sẽ thấy nó không quá chậm theo thời gian nếu bạn xóa dòng Bundler.require và chỉ cần đá quý khi cần.

+0

Tôi không thể tìm thấy 'Bundler.setup (: default,: development)' trong 'config/boot.rb' hoặc' config/application.rb'? – CuriousMind

+0

Rất tiếc, tôi xin lỗi, nó yêu cầu 'bundler/setup', điều này đang làm gián tiếp https://github.com/carlhuda/bundler/blob/master/lib/bundler/setup.rb – d11wtq

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