2011-09-24 14 views
25

Il comando "rake assets: precompile" funziona molto lentamente per me. Soprattutto sul mio server di produzione Micro Amazon EC2 che non ha molte risorse del processore. Su EC2 devo aspettare almeno 1 minuto durante ogni distribuzione solo per questo compito di precompilazione. C'è un modo per renderlo più veloce?asset rake: precompilare è lento

In precedenza ho utilizzato Jammit per comprimere/ridurre css e js. Jammit ha funzionato quasi 10 volte più velocemente sullo stesso sito Web e server.

+2

è possibile precompilare le risorse prima della distribuzione –

+1

Giusto, ci ho pensato. Ma non so come distribuirò facilmente le risorse precompilate alla produzione. Sto usando capistrano e ogni volta che impegnerà le risorse precompilate per git. La mia preoccupazione è che il repository git crescerà rapidamente in questo caso, mantenendo la cronologia di tutte le risorse precedenti. E questo non è solo css/js - ma anche tutte le immagini degli asset. – Evgenii

+2

Anche per me è estremamente lento (135.987 ms = ~ 2 minuti). Dovrò esaminare la pre-compilazione prima della distribuzione ... Sono preoccupato di aggiungerli anche a git, soprattutto perché ciò aggiungerebbe molto rumore ai log git. Consiglierei di non aggiungerli a git: basta rsync quella directory da localhost al server web come parte dello script di distribuzione cap. –

risposta

30

Se non c'è bisogno di caricare l'ambiente Rails, è necessario disattivare quello con:

config.assets.initialize_on_precompile = false 

EDIT: Ho appena scritto una gemma per risolvere questo problema, chiamato turbo-sprockets-rails3. Accelera il tuo assets:precompile solo ricompilando i file modificati e compilando solo una volta per generare tutte le risorse.

Sarebbe fantastico se potessi aiutarmi a testare la gemma turbo-sprockets-rails3 e fammi sapere se hai qualche problema.

+3

La tua gemma è fantastica.Risolto il mio problema con d3 e pre-compilazione. Grazie uomo – chaostheory

10

C'è uno bug in Rails 3.1.0 che include troppi file nel processo di precompilazione. Questo potrebbe essere il motivo della lentezza se si hanno molti asset js e css.

L'altro è che le ruote dentate (la gemma che fa la compilazione) è più complessa e deve consentire più opzioni - scss, coffeescript ed erb. Per questo motivo, sospetto che sarà più lento fare solo concatenazione e minificazione.

Come suggerito, è possibile precompilare i file prima di distribuirli se questo è ancora un problema.

+0

Grazie per la spiegazione. Penso anche che sia lento perché ha bisogno di caricare l'ambiente delle rotaie sulla produzione, il che non era il caso di Jammit. In ogni caso, non ho intenzione di tornare su Jammit. Mi piace molto la pipeline di asset. – Evgenii

1

La mia soluzione è escludere application.js .css e qualsiasi altra risorsa correlata all'applicazione dalla pre-compilazione. In modo che io possa utilizzare rake assets:precompile una volta per precompilare solo le risorse relative al motore.

Poi su ogni implementare Io uso un semplice task rake per costruire qualsiasi attività relative applicazioni e unirle in 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 

Per specificare quali risorse compilare io uso un file di configurazione YAML (config/assets.yml):

es.

--- 
- site/site.css 
- admin/admin.css 
- site/site.js 
- admin/admin.js 
Problemi correlati