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
bạn có thể biên dịch trước nội dung của mình trước khi triển khai –
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
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. –