2013-03-13 22 views
15

Zauważyłem moje aktywa wydaje się skompilowany dwa razy, co znacznie spowalnia mojego rozmieszczenia, jak ten etap jest najbardziej czasochłonna część:Dlaczego moje zasoby Rails są kompilowane dwukrotnie?

~/projects/rewportal(mapwidget ✔) rake assets:precompile 
/home/ruy/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /home/ruy/.rvm/gems/[email protected]/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets 
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb 
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb 
AssetSync: Syncing. 
Using: Directory Search of /home/ruy/projects/rewportal/public/assets 
Uploading: assets/application-5170f52c1dd49cb382d5135bee01d75e.js 
[...] 
Fetching files to flag for delete 
Flagging 8 file(s) for deletion 
Deleting: assets/active_admin-4ce46d089d4b0080e87c9abcb6fa6c97.css 
[...] 
AssetSync: Done. 

Jest to normalne?

Kiedy precompile do innych środowiskach (nieprodukcyjnych), mogę zobaczyć szczegółowe zestawienie poszczególnych aktywów dwukrotnie:

~/projects/rewportal(mapwidget ✔) rake RAILS_ENV=qa assets:precompile --trace 
** Invoke assets:precompile (first_time) 
** Execute assets:precompile 
/home/ruy/.rvm/rubies/ruby-1.9.3-p194/bin/ruby /home/ruy/.rvm/gems/[email protected]/bin/rake assets:precompile:all RAILS_ENV=qa RAILS_GROUPS=assets --trace 
** Invoke assets:precompile:all (first_time) 
** Execute assets:precompile:all 
** Invoke assets:precompile:primary (first_time) 
** Invoke assets:environment (first_time) 
** Execute assets:environment 
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb 
** Invoke tmp:cache:clear (first_time) 
** Execute tmp:cache:clear 
** Execute assets:precompile:primary 
Compiled gmaps4rails/gmaps4rails.base.js (141ms) (pid 8480) 
Compiled gmaps4rails/gmaps4rails.googlemaps.js (148ms) (pid 8480) 
[...] 
Compiled active_admin.css (1299ms) (pid 8480) 
Compiled active_admin/print.css (113ms) (pid 8480) 
** Invoke assets:precompile:nondigest (first_time) 
** Invoke assets:environment (first_time) 
** Execute assets:environment 
AssetSync: using /home/ruy/projects/rewportal/config/initializers/asset_sync.rb 
** Invoke tmp:cache:clear (first_time) 
** Execute tmp:cache:clear 
** Execute assets:precompile:nondigest 
Compiled gmaps4rails/gmaps4rails.base.js (133ms) (pid 8480) 
Compiled gmaps4rails/gmaps4rails.googlemaps.js (133ms) (pid 8480) 
[...] 
Compiled active_admin.css (1290ms) (pid 8480) 
Compiled active_admin/print.css (116ms) (pid 8480) 
AssetSync: Syncing. 
Using: Directory Search of /home/ruy/projects/rewportal/public/assets 
Uploading: assets/active_admin-d05b61ab8366b74eabc9074d3e60fe82.css.gz 
[...] 
Fetching files to flag for delete 
Flagging 6 file(s) for deletion 
Deleting: assets/active_admin-ec90e7d9a9f45f14d1387f58fa1452b4.css 
[...] 
AssetSync: Done. 

My application.rb ma następujące:

config.assets.precompile += %w(active_admin/print.css active_admin.css active_admin.js admin.js admin.css html5shiv.js) 

pomysły?

+0

Myślę, że to nie jest normalne. Spróbuj użyć ** foreman start ** na lokalnym hoście. –

+0

Wygląda więc na to, że nie jest to specyficzne dla Heroku. Uruchomiłem 'rake assets: precompile', a także zrobiłem to dwa razy. Zaktualizuję tytuł i szczegóły. –

+0

Dokładnie ten sam problem. Wszystko działa, ale wydaje się, że odpady uruchamiają to dwa razy. – MoMolog

Odpowiedz

1

Czy używasz capistrano? Jeśli tak, to można spróbować skompilować swoje aktywa lokalnie, a następnie przesłać do serwera, z zadaniem jak ten

namespace :deploy do 
    namespace :assets do 
    desc "Precompile assets on local machine and upload them to the server." 
    task :precompile, roles: :web, except: {no_release: true} do 
     run_locally "bundle exec rake assets:precompile" 
     find_servers_for_task(current_task).each do |server| 
     run_locally "rsync -vr --exclude='.DS_Store' public/assets #{user}@#{server.host}:#{shared_path}/" 
     end 
    end 
    end 
end 
0

I nadpisać zadanie deploy_all wewnątrz deploy.rb skompilować przed przesłaniem:

task :remake_all do 
    puts "precompiling assets" 
    res = `env rake assets:precompile:all RAILS_ENV=precompile RAILS_GROUPS=assets 2>&1` 

    $stderr.puts "assets res is: #{res}" 
    if res =~ /aborted|don't|invalid|segmentation|bug/i 
    puts "############ Unable to compile assets #########" 
    exit 
    end 
end 

Miałem problemy ze środowiskiem programistycznym nie kompilującym się prawidłowo, a środowisko produkcyjne wymagające dostępu do serwerów mysql za zaporą ogniową, więc utworzyło nowe środowisko o nazwie: prekompilacja

11

Railsy 3 domyślnie kompilują raz, aby wygenerować zasoby odcisków palców, i raz do generowanie zasobów bez odcisków palców (odciski palców mają skrót MD5 w nazwie pliku).

Możesz użyć turbo-sprockets-rails3 gem, aby utworzyć obie z jednej kompilacji.

W Rails 4, funkcja ta została ekstrakcji do sprockets-rails gem i zachowanie zostało zmienione, więc podwójna kompilacja się nie dzieje w Rails 4.

0

Rozwiązaniem dla mnie (Rails 3) było uruchomić rake assets:precompile:primary zamiast rake assets:precompile:all.

Powiązane problemy