2011-09-02 15 views
48

Chcę, aby Rails 3.1 zbierał więcej moich zasobów do wstępnej kompilacji. W szczególności domyślny mechanizm dopasowujący do kompilowania plików nie dodaje plików .js z vendor/assets/javascripts. Mogę po prostu dodać aktywa do listy config.assets.precompile, ale wydaje się to denerwujące. Nie chcę do nich odnosić się w manifeście application.js, ponieważ nie chcę, aby były one zawarte na wszystkich stronach.Prekompilacja zasobów Rails 3.1 - uwzględnij wszystkie pliki javascript

Podsumowując, można zażądać, aby wszystkie pliki .js znalezione w vendor/assets/javascripts zostały wstępnie skompilowane przez rake assets:precompile, ale bez uwzględnienia ich na wszystkich stronach?

Odpowiedz

69

config.assets.precompile akceptuje wyrażeń regularnych i wieloznaczny dopasowanie - tak aby zapewnić wszystkie js pliki zostają skompilowane bez określania siebie po imieniu, coś jak to powinno załatwić sprawę:

config.assets.precompile << '*.js' 
+0

Przepraszam za trochę stuknięty tutaj, ale można pokazać przykład dodanie regexp, aby dodać wszystkie zwykłe pliki js i css, ale NIE wszystkie pliki kawy lub plików scss? Próbowałem napisać jedną i to nie działa ... – Andrew

+20

Prawdopodobnie chcesz nadpisać to, co jest już w prekompilacji: 'config.assets.precompile = ['* .js', '* .css']' . – pat

+1

Chociaż prawdopodobnie będziesz chciał dodać coś do swoich obrazów. – pat

2

zmodyfikowałem przykładzie podanym w Rails config.assets.precompile setting to process all CSS and JS files in app/assets i tutaj jest moja wersja, która wykonuje wszystkie aktywa z/app i/sprzedawca wyjątkiem podszablonów (począwszy od _)

config.assets.precompile << Proc.new { |path| 
    if path =~ /\.(css|js)\z/ 
    full_path = Rails.application.assets.resolve(path).to_path 
    app_assets_path = Rails.root.join('app', 'assets').to_path 
    vendor_assets_path = Rails.root.join('vendor', 'assets').to_path 

    if ((full_path.starts_with? app_assets_path) || (full_path.starts_with? vendor_assets_path)) && (!path.starts_with? '_') 
     puts "\t" + full_path.slice(Rails.root.to_path.size..-1) 
     true 
    else 
     false 
    end 
    else 
    false 
    end 
} 
0
# Precompile *all* assets, except those that start with underscore 
config.assets.precompile << /(^[^_\/]|\/[^_])[^\/]*$/ 

Odniesienie do 55 minut Blog w celu uzyskania pełnego objaśnienia.

Będzie precompile żadnych aktywów, nie tylko JavaScript (js, .coffee, .swf, .css, .scss)

+0

To jest świetne. Czy jest jakikolwiek powód, dla którego * nie chciałbym * prekompilować wszystkich aktywów? – AlexChaffee

+0

@AlexChaffee, jeśli używasz czegoś takiego jak SASS lub wymaganych komentarzy do przygotowania "pakietów" zasobów. –

Powiązane problemy