Moje rozwiązanie polega na wykluczeniu z prekompilacji aplikacji .css i wszelkich innych zasobów związanych z aplikacją. Dzięki temu mogę jednorazowo użyć rake assets:precompile
, aby wstępnie skompilować zasoby związane z silnikiem.
Następnie na każdym wdrożeniu używam proste zadanie natarcia budować żadnych aktywów aplikacyjnych związanych i połączyć je w 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
Aby określić, które aktywa kompilacji używam plik konfiguracyjny YAML (config/assets.yml
):
np.
---
- site/site.css
- admin/admin.css
- site/site.js
- admin/admin.js
możesz wstępnie skompilować swoje aktywa przed wdrożeniem –
Dobra, myślałem o tym. Ale nie wiem, jak łatwo wdrożyć prekompilowane zasoby do produkcji. Używam capistrano i za każdym razem, gdy skończę wstępne skompilowanie aktywów. Obawiam się, że repozytorium git będzie szybko rosło w tym przypadku, zachowując historię wszystkich poprzednich zasobów. I to nie jest tylko css/js - ale także wszystkie obrazy zasobów. – Evgenii
Dla mnie też jest bardzo powolny (135 987ms = ~ 2 minuty). Muszę przyjrzeć się wstępnemu kompilacji przed wdrożeniem ... Obawiam się, że dodam je również do git, głównie dlatego, że dodałoby to sporo hałasu do dzienników git. Nie polecałbym dodawać ich do git - wystarczy zsynchronizować ten katalog z localhost z serwerem internetowym jako częścią skryptu cap caploy. –