Nhiệm vụ này được thực hiện khó khăn hơn bởi thực tế là sprockets làm việc với đường dẫn logic mà không làm bao gồm vị trí nguồn cấp dữ liệu cơ bản, chưa được lưu trữ.
Giả sử dự án của tôi có tệp JS "/app/assets/javascripts/foo/bar.js.coffee".
Trình biên dịch sprockets trước tiên sẽ xác định phần mở rộng của tệp đầu ra, trong trường hợp này là ".js" và sau đó đánh giá liệu có biên dịch đường dẫn logic "foo/bar.js" hay không. Tài nguyên chưa được biên dịch có thể nằm trong "app/assets/javascripts", "vendor/assets/javascripts", "lib/assets/javascripts" hoặc gem, do đó không có cách nào để bao gồm/loại trừ một tệp cụ thể dựa trên đường dẫn logic một mình.
Để xác định vị trí của tài nguyên cơ bản, tôi tin rằng cần phải hỏi môi trường sprockets (có sẵn thông qua đối tượng Rails.application.assets) để giải quyết đường dẫn thực của tài nguyên cho đường dẫn logic.
Đây là giải pháp mà tôi đang sử dụng. Tôi khá mới với Ruby vì vậy đây không phải là mã thanh lịch nhất:
# In production.rb
config.assets.precompile << Proc.new { |path|
if path =~ /\.(css|js)\z/
full_path = Rails.application.assets.resolve(path).to_path
app_assets_path = Rails.root.join('app', 'assets').to_path
if full_path.starts_with? app_assets_path
puts "including asset: " + full_path
true
else
puts "excluding asset: " + full_path
false
end
else
false
end
}
Với sprockets> 3.0, điều này sẽ không làm việc trong sản xuất vì Rails.application.assets sẽ bằng không (giả sử mặc định: config .assets.compile = false).
Để workaround bạn thay thế full_path nhượng với:
@assets ||= Rails.application.assets || Sprockets::Railtie.build_environment(Rails.application)
full_path = @assets.resolve(path)
Xem thêm: https://github.com/rails/sprockets-rails/issues/237
bản sao có thể có của [Làm cách nào để sử dụng config.assets.precompile cho thư mục thay vì tệp đơn?] (Http://stackoverflow.com/questions/12613980/how-do-i-use-config-assets-precompile -for-directories-chứ-than-single-files) – Jason