2011-11-07 20 views
14

domanda rapida per rotaie professionisti là fuori ...Rails: Usa livereload con Asset Pipeline

Quando si lavora con applicazioni Rails 3.0.x ero un utente pesante di Guardia e LiveReload. Tuttavia, sembra che quando si utilizza la pipeline di asset in Rails 3.1 la guardia del fegato non sappia che le modifiche a un file Sass dovrebbero innescare l'invio di nuovi css al browser.

Qualcuno sta utilizzando LiveReload con la pipeline di asset? Se sì, come lo stai facendo funzionare?

Grazie!

risposta

21

Dopo aver seguito alcuni fili di emissione su Github ho trovato la seguente fisso il mio problema:

1) Assicurarsi che tutti i file SCSS sono denominate seguendo la nuova convenzione di asset, in questo modo: filename.css.scss

stavo usando SCSS prima di Rails 3.1 e avevo appena chiamato tutti i miei file sass filename.scss.

2) Utilizzare quanto segue per livereload nel guardfile:

guard 'livereload' do 
    watch(%r{app/helpers/.+\.rb}) 
    watch(%r{app/views/.+\.(erb|haml)}) 
    watch(%r{(public/).+\.(css|js|html)}) 
    watch(%r{app/assets/stylesheets/(.+\.css).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{app/assets/javascripts/(.+\.js).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{lib/assets/stylesheets/(.+\.css).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{lib/assets/javascripts/(.+\.js).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{vendor/assets/stylesheets/(.+\.css).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{vendor/assets/javascripts/(.+\.js).*$}) { |m| "assets/#{m[1]}" } 
    watch(%r{config/locales/.+\.yml}) 
end 
+0

bello, mi aveva dimenticato la cartella lib. Ti infastidirei lanciando la directory dei venditori anche lì? – stephenmurdoch

+1

Certo, aggiunta la directory del fornitore. – Andrew

+0

Assicurati di avere la gemma guardia-fegato nel tuo GemFile. – FearMediocrity

6

ho trovato quanto segue per funzionare abbastanza bene anche:

guard :livereload do 
    watch(%r{^app/.+\.(erb|haml|js|css|scss|sass|coffee|eco|png|gif|jpg)}) 
    watch(%r{^app/helpers/.+\.rb}) 
    watch(%r{^public/.+\.html}) 
    watch(%r{^config/locales/.+\.yml}) 
end 

Questo non è il codice predefinito che viene generato quando corri guard init livereload come per qualche motivo che non funziona così bene con le importazioni sass.

+1

Sì, se stai usando SASS correttamente non vuoi che i tuoi partial siano compilati in css quindi non puoi chiamarli * .css.scss. –

+0

Ho postato questa domanda correlata per chiarimenti su questo punto: http://stackoverflow.com/questions/12334515/naming-imported-scss-files-scss-or-css-scss. Quindi se hai un file chiamato _file.scss e viene usato in @import "file" ;, allora questa strategia per livereload è quella giusta e questi file non dovrebbero essere rinominati in _file.css.scss. – justingordon

+0

Sì! Questo mi ha aiutato più di ogni altro esempio. Sto usando la pipeline di asset combinata con un sistema di inclusione SCSS. L'esempio ha funzionato "out of the box" per me. – BradGreens

1

Come @mirko menzionato nel suo commento, i file .css aggiuntivi su scss sono deprecati. Quindi aggiungere che non è una grande soluzione, e ho sperimentato che semplicemente aggiungendo l'estensione scss forza il caricamento di una pagina.

Così ho trovato che questo funziona:

watch(%r{(app|vendor)(/assets/\w+/(.+)\.(scss))}) { |m| "/assets/#{m[3]}.css" }` 

La mia comprensione è questa mappa il file SCSS al file css compilato. Spero che funzioni anche per bene.

Source: Github Issue

Problemi correlati