2013-08-23 37 views
7

Việc triển khai sản xuất của tôi mất thêm vài phút do phải mất thời gian để cài đặt đá quý nokogiri (1.6.0). Tôi hiểu điều này là do cài đặt gem kích hoạt trình biên dịch mở rộng gốc.Bỏ qua việc biên dịch lại phần mở rộng gốc trên cài đặt bó tiếp theo

Lưu ý rằng tôi đã đóng gói bó của tôi và kiểm tra nó vào DVCS

bundle package 

Có cách nào để tránh biên dịch lại các phần mở rộng tự nhiên nếu không có gì khác đã thay đổi, do đó triển khai nhanh hơn?

Cập nhật:

tôi sử dụng Opscode Chef để triển khai (đầu bếp hát solo được cụ thể)

môi trường là: Ubuntu 12.04LTS 64bit của Ruby 193-p448

+0

A 'bó install' thường bỏ qua đá quý mà Bundler thấy đã phù hợp với yêu cầu. Bạn đang sử dụng cái gì để triển khai? –

+0

@NeilSlater Tôi sử dụng đầu bếp để triển khai. – Litmus

+0

Tôi không có câu trả lời cho tất cả các tiện ích mở rộng gốc, nhưng bạn đã thử thêm 'NOKOGIRI_USE_SYSTEM_LIBRARIES = true' chưa? – zrl3dx

Trả lời

4

Tôi tìm thấy một cách để làm điều này. Dưới đây là giải thích:

Bundler, theo mặc định cài đặt đá quý vào thư mục được chỉ báo bởi biến môi trường BUNDLE_PATH. Giá trị mặc định của BUNDLE_PATHvendor/bundle. Do đó tất cả các đá quý được cài đặt trong thư mục /vendor/bundle, mà xảy ra là một thư mục riêng (cho mỗi phiên bản của ứng dụng Rails). Khi một phiên bản mới của ứng dụng Rails được cài đặt, vendor/bundle không tồn tại. Do đó Bundler cài đặt/biên dịch trước mỗi viên đá quý. Nó nhặt đá quý từ vendor/cache, tiết kiệm tốt khi tải xuống giống nhau từ rubygems.org, nhưng vẫn không thể tránh việc biên dịch các tiện ích mở rộng gốc.

Chúng tôi có thể ghi đè điều này bằng cách chuyển --path /shared/path đến dòng lệnh bundle install. Điều này sẽ đảm bảo rằng các viên đá quý luôn được cài đặt trong /shared/path, có thể truy cập được tới tất cả các phiên bản (của ứng dụng Rails).

Với cách tiếp cận này, trình bundler sẽ không cố gắng cài đặt lại/biên dịch lại đá quý, vì nó tìm thấy cùng một cài đặt.

vậy, đây là lệnh kỳ diệu mà làm việc cho tôi

bundle install --local --deployment --path /shared/bundle --without development test 
+0

Hãy cảnh giác rằng một ngày nào đó, bạn có thể có một ứng dụng bị kẹt trong quá khứ không thể sử dụng đá quý gần đây nhất. Khi điều đó xảy ra, bạn có thể hối hận vì đã không có đá quý của bạn. –

+1

Không đúng sự thật. Trong sản xuất, tôi muốn ứng dụng chỉ sử dụng những viên đá quý bị khóa bằng 'Gemfile.lock'. Nâng cấp Gem xảy ra trong quá trình phát triển (sử dụng 'gói đã lỗi thời' và' cập nhật gói'). Vì tôi sử dụng 'bundle package', những gem được nâng cấp này được lưu trữ trong' vendor/cache'.Và trong sản xuất khi tôi chạy 'bundle install --deployment', các gem mới được chọn từ' vendor/cache' và được cài đặt trong đường dẫn được chỉ định bởi tùy chọn '--path' như đã giải thích ở trên. – Litmus

+0

Điều này rất hữu ích và hoàn toàn an toàn mà tôi tự hỏi tại sao đây không phải là hành vi mặc định khi sử dụng '--deployment'! Nokogiri là cơn ác mộng tồi tệ nhất của mỗi người triển khai. –

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