2012-06-20 31 views

Trả lời

23

Trong cụ dụ của bạn họ có thể được coi như nhau, tuy nhiên trong thực tế họ không giống nhau .

bundle exec thực hiện một số thay đổi đối với môi trường mà bundler/setup không thực hiện. Nếu foo.rb của bạn không bao giờ chạy một subshell, hoặc không bao giờ cố gắng chạy các tập tin thực thi ruby ​​khác trong subshells, thì cả hai phiên bản đều tương đương (chúng sẽ load cả gem một cách chính xác và làm việc giống nhau).

Toàn bộ ý tưởng với bundle exec là để cho phép bạn thực thi chạy rằng không được thiết kế ban đầu với bundler nhớ. Giống như rspec, rails, rackup. Nếu ứng dụng của riêng bạn (foo.rb) không cố gắng chạy các tệp thi hành như vậy mà có thể phụ thuộc vào nhóm của bạn, thì nó cũng không tạo ra sự khác biệt nào. Vì tất cả những gì bạn muốn đảm bảo với bundler là bạn tải đúng đá quý, và cho rằng bundler/setup hoạt động chính xác như mong đợi trong trường hợp của bạn.

Từ bundler docs khi nói chuyện về việc chạy hệ điều ruby ​​thực thi:

Trong một số trường hợp, chạy file thực thi mà không bó exec có thể làm việc, nếu thực thi xảy ra phải được cài đặt trong hệ thống của bạn và không kéo trong bất kỳ đá quý xung đột với gói của bạn.

Tuy nhiên, điều này không đáng tin cậy và là nguồn gây đau đáng kể. Ngay cả khi nó có vẻ như nó hoạt động, nó có thể không hoạt động trong tương lai hoặc trên một máy khác.

Sau đó từ manpage of bundle exec bạn có thể nhận được một số manh mối khác như những gì bundle exec thực sự thực hiện:

MÔI TRƯỜNG SỬA ĐỔI

  • chắc chắn rằng nó vẫn có thể bao ra để bó từ bên trong một lệnh được thực hiện bởi gói exec (sử dụng $ BUNDLE_BIN_PATH)
  • đặt thư mục conta thực thi ining (như đường ray, rspec, rackup) cho nhóm của mình trên $ PATH
  • chắc chắn rằng nếu bundler được gọi trong subshell, nó sử dụng cùng Gemfile (bằng cách thiết lập BUNDLE_GEMFILE)
  • thêm -rbundler/thiết lập để $ RUBYOPT, mà làm cho chắc chắn rằng các chương trình của Ruby gọi trong subshell có thể nhìn thấy những viên đá quý trong gói

Vì vậy, nếu bạn xây dựng ứng dụng của bạn với sự hỗ trợ bundler trong tâm trí, sau đó bạn không bao giờ cần phải bundle exec ứng dụng của bạn.

Nhưng nếu bạn cần phải sử dụng công cụ khác mà nạp mã ứng dụng của bạn mà có thể tải đá quý trước họ nạp mã ứng dụng của bạn (mà sau đó có thể kéo trong một viên ngọc không kèm sai), sau đó bạn cần phải sử dụng bundle exec.

+0

Câu trả lời hay, cảm ơn bạn rất nhiều! –

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