Мое решение состоит в том, чтобы исключить application.js .css и любые другие связанные с приложением активы из предварительной компиляции. Так что я могу использовать rake assets:precompile
один раз для прекомпиляции только связанных с движком ресурсов.
Затем при каждом развертывании я использую простое задание на грабли, чтобы создать ресурсы, связанные с любым приложением, и объединить их в 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
Чтобы указать, какие ресурсы для компиляции, я использую файл конфигурации YAML (config/assets.yml
):
например.
---
- site/site.css
- admin/admin.css
- site/site.js
- admin/admin.js