Mi solución es excluir application.js .css y cualquier otro activo relacionado con la aplicación desde la precompilación. De modo que puedo usar rake assets:precompile
una vez para precompilar activos relacionados con el motor solamente.
Luego, en cada despliegue yo uso una tarea rake sencillo de construir los activos relacionados con la aplicación y fusionarlas en 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
para especificar qué activos para compilar i utilizar un archivo de configuración YAML (config/assets.yml
):
por ej.
---
- site/site.css
- admin/admin.css
- site/site.js
- admin/admin.js
puede precompilar sus activos antes de implementar –
Correcto, pensé en eso. Pero no sé cómo implementaré los activos precompilados para producción fácilmente. Estoy usando capistrano y cada vez se comprometerán los activos precompilados a git. Mi preocupación es que el repositorio de git crecerá rápidamente en este caso, manteniendo el historial de todos los activos anteriores. Y eso no es solo css/js, sino también todas las imágenes de los activos. – Evgenii
También es extremadamente lento para mí (135,987ms = ~ 2 minutos). Tendré que buscar precompilación antes de implementar ... Me preocupa agregarlos a git también, sobre todo porque eso agregaría mucho ruido a los registros de git. Yo recomendaría no agregarlos a git, simplemente rsync ese directorio de localhost a su servidor web como parte de su script de despliegue de tapa. –