2012-07-15 15 views
10

Widziałem różne zawiłe i na ogół nieskuteczne rozwiązania do wykonywania leniwy precompile zasobu w Rails. Jako deweloper backend nie szczególnie chce skompilować aktywa nigdy dotknąć za każdym razem program wdraża, ale dlatego, że aktywa są ładowane Capfile poprzez load 'deploy/assets', nie definiując zadania w deploy.rb, nie mogę myśleć o sposób warunkowo wyłącz to.Warunkowo wyłączyć prekompilacji atutem w Kapistrana

Zachowanie, którego przestrzegam, polega na używaniu cap deploy do regularnego wdrażania z prekompilacją i używania cap deploy:no_assets do pomijania wdrażania zasobów.

Odpowiedz

7

rails4 rozwiązuje ten problem z nową wersją zębatek, poprzez wstępną kompilację aktywów, które uległy zmianie. W międzyczasie dla aplikacji rails3 polecam klejnot turbo-sprockets-rails3.

Ten klejnot zaczynał jako set of patches dla sprockets-rails Nathan Broadbent, które nie zostały połączone w master ponieważ problem został już rozpatrzony w rails4. Od README:

  • przyspiesza Rails 3 Aktywa Zgrabiarka: precompile przez tylko rekompilacji zmienionych aktywów, w oparciu o hash swoich plików źródłowych

  • Tylko kompiluje raz generować zarówno odciski palców i innych aktywa -fingerprinted

I:

turbozespoły-szyny3 powinny być gotowe do pracy z najnowszą wersją Capistrano.

Mogę potwierdzić, że działa dobrze dla mnie na aplikacjach rails-3.2.x wdrażanych w Capistrano.

Jako notatkę dla GitHubbers oryginalny pull request jest doskonałym przykładem na to, jak przesłać kod do projektu open source, nawet jeśli nie został scalony.

+1

Właśnie się do tego przyłączyłem i mogę potwierdzić, że jest super! – RubberDucky

+2

Mam Rails 4.0 i nie zmieniam żadnych aktywów, ale po prostu przekompilowuję wszystko od zera. Dowolny pomysł? – scaryguy

1

Ta istota wygląda bardzo obiecująco https://gist.github.com/3072362

Sprawdza dziennik git od ostatniego wdrożyć ją teraz, aby zobaczyć, czy są jakieś zmiany w %w(app/assets lib/assets vendor/assets Gemfile.lock config/routes.rb) i jeśli tak, to tylko precompiles wtedy.

+0

Zainstalowałem ten punkt kontrolny i podobne do niego wcześniej, ale wydaje się, że nie miało to żadnego wpływu. Jeśli zostanę 'load 'wdrożyć/assets'' w moim capfile, to nie przestaje prekompilować, gdy nie jest potrzebne. Jeśli wyjmę 'load 'deploy/assets'', to nie będzie prekompilował, nawet jeśli będzie to konieczne. Nawet z dodanym wyzwalaczem do uruchomienia po aktualizacji kodu. – RubberDucky

+0

Wydaje mi się, że nie jest to wymagane w pliku config/deploy.rb. Nadpisuje zadanie deploy: assets: prekompilacja. Powinieneś zachować 'load 'deploy/assets'' w swoim Capfile. –

+0

To wciąż jest szybsze niż turbo-sporocket-rails, ponieważ pomija całe sprawdzanie, które zajmuje mi minutę. – lulalala

14

Zarówno turbo-sporocket-rails, jak i te skrypty auto-skip mają pewne pułapki (wspomnę później). Więc używam następujący hack, więc mogę przekazać parametr pominąć precompile aktywów w mojej woli:

callback = callbacks[:after].find{|c| c.source == "deploy:assets:precompile" } 
callbacks[:after].delete(callback) 
after 'deploy:update_code', 'deploy:assets:precompile' unless fetch(:skip_assets, false) 

Ten skrypt zmieni hak aktywami prekompilacji wbudowany, więc zostaną zaczepione na podstawie parametr skip_assets. Mogę zadzwonić pod numer cap deploy -S skip_assets=true, aby pominąć prekompilację aktywów jako całość.


Dla mnie turbo-sporocket-rails nadal zajmuje kilka minut, aby sprawdzić, gdy nic się nie zmieniło.Może to mieć kluczowe znaczenie, gdy muszę jak najszybciej wprowadzić poprawkę na serwerze. Dlatego potrzebuję mojej metody pomijania siły.

+0

Gdzie dokładnie dodajesz ten kod, żeby działał? –

+0

@dtmunir Dodałem go pod koniec pliku deploy.rb. – lulalala

+0

To jest świetne rozwiązanie. W aplikacji Rails 4 z Capistrano 2 i nadal działa. Musisz tylko uważać, aby nie wykonywać innych zadań związanych z opcją "wdrażaj: zasoby: prekompilacja" lub zostaną one również pominięte. –

Powiązane problemy