2011-09-24 43 views
25

Lệnh "cào tài sản: biên dịch trước" hoạt động rất chậm đối với tôi. Đặc biệt là trên máy chủ sản xuất Amazon EC2 Micro của tôi mà không có nhiều tài nguyên xử lý. Vào EC2, tôi phải chờ 1 phút trở lên trong mỗi lần triển khai chỉ dành riêng cho nhiệm vụ biên dịch trước này. Có cách nào để làm cho nó nhanh hơn không?tài sản cào: biên dịch trước chậm

Trước đây tôi đã sử dụng Jammit để nén/rút gọn css và js. Jammit làm việc nhanh hơn gần 10 lần trên cùng một trang web và máy chủ.

+2

bạn có thể biên dịch trước nội dung của mình trước khi triển khai –

+1

Phải, tôi đã nghĩ về điều đó. Nhưng tôi không biết làm thế nào tôi sẽ triển khai các tài sản biên dịch trước để sản xuất dễ dàng. Tôi đang sử dụng capistrano và mỗi lần nó sẽ cam kết các tài sản biên dịch trước để git. Mối quan tâm của tôi là kho git sẽ phát triển nhanh trong trường hợp này, giữ lịch sử của tất cả các tài sản trước đó. Và đó không chỉ là css/js - nhưng tất cả các hình ảnh tài sản là tốt. – Evgenii

+2

Nó cũng rất chậm đối với tôi (135,987ms = ~ 2 phút). Tôi sẽ phải xem xét trước khi biên dịch trước khi triển khai ... Tôi cũng lo lắng về việc thêm chúng vào git, chủ yếu là vì điều đó sẽ thêm rất nhiều tiếng ồn vào các bản ghi git. Tôi khuyên bạn không nên thêm chúng vào git - chỉ cần rsync thư mục đó từ localhost tới máy chủ web của bạn như một phần của tập lệnh triển khai giới hạn của bạn. –

Trả lời

30

Nếu bạn không cần phải tải các môi trường Rails, bạn nên tắt rằng với:

config.assets.initialize_on_precompile = false 

EDIT: Tôi vừa mới viết một viên ngọc để giải quyết vấn đề này, được gọi là turbo-sprockets-rails3. Nó tăng tốc độ assets:precompile của bạn bằng cách chỉ biên dịch lại các tệp đã thay đổi và chỉ biên dịch một lần để tạo tất cả nội dung.

Thật tuyệt vời nếu bạn có thể giúp tôi kiểm tra viên đá quý turbo-sprockets-rails3 và cho tôi biết nếu bạn có bất kỳ sự cố nào.

+3

Đá quý của bạn là tuyệt vời.Giải quyết vấn đề của tôi với d3 và biên dịch trước. Cảm ơn người đàn ông – chaostheory

10

Có một bug in Rails 3.1.0 bao gồm quá nhiều tệp trong quá trình biên dịch trước. Đây có thể là lý do cho sự chậm chạp nếu bạn có nhiều tài sản js và tài sản css.

Khác là Sprockets (đá quý làm biên dịch) phức tạp hơn và phải cho phép nhiều tùy chọn hơn - scss, coffeescript và erb. Bởi vì điều này tôi nghi ngờ nó sẽ chậm hơn chỉ làm nối và rút gọn.

Như được đề xuất, bạn có thể biên dịch trước các tệp trước khi triển khai chúng nếu đây vẫn là một vấn đề.

+0

Cảm ơn bạn đã giải thích. Tôi cũng nghĩ rằng nó là chậm vì nó cần phải tải môi trường đường ray vào sản xuất, đó không phải là trường hợp cho Jammit. Trong mọi trường hợp, tôi sẽ không quay lại Jammit. Tôi rất thích đường ống tài sản. – Evgenii

1

Giải pháp của tôi là loại trừ application.js .css và mọi nội dung liên quan đến ứng dụng khác khỏi khỏi biên dịch trước. Vì vậy mà tôi có thể sử dụng rake assets:precompile một lần để biên dịch trước các tài sản liên quan đến động cơ.

Sau đó, trên mỗi triển khai tôi sử dụng một nhiệm vụ cào đơn giản để xây dựng bất kỳ tài sản ứng dụng liên quan và hợp nhất chúng vào manifest.yml:

namespace :assets do 
    task :precompile_application_only => :environment do 
    require 'sprockets' 

    # workaround used also by native assets:precompile:all to load sprockets hooks 
    _ = ActionView::Base 

    # ============================================== 
    # = Read configuration from Rails/assets.yml = 
    # ============================================== 

    env   = Rails.application.assets 
    target  = File.join(::Rails.public_path, Rails.application.config.assets.prefix) 
    assets  = YAML.load_file(Rails.root.join('config', 'assets.yml')) 
    manifest_path = Rails.root.join(target, 'manifest.yml') 
    digest  = !!Rails.application.config.assets.digest 
    manifest  = digest 


    # ======================= 
    # = Old manifest backup = 
    # ======================= 

    manifest_old = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {} 

    # ================== 
    # = Compile assets = 
    # ================== 

    compiler = Sprockets::StaticCompiler.new(env, 
              target, 
              assets, 
              :digest => digest, 
              :manifest => manifest) 
    compiler.compile 

    # =================================== 
    # = Merge new manifest into old one = 
    # =================================== 

    manifest_new = File.exists?(manifest_path) ? YAML.load_file(manifest_path) : {} 

    File.open(manifest_path, 'w') do |out| 
     YAML.dump(manifest_old.merge(manifest_new), out) 
    end 

    end 
end 

Để xác định tài sản để biên dịch tôi sử dụng một tập tin cấu hình YAML (config/assets.yml):

ví dụ:

--- 
- site/site.css 
- admin/admin.css 
- site/site.js 
- admin/admin.js 
Các vấn đề liên quan