node.js - que - Grunt: Ver varios archivos, Compilar solo modificado
npm (4)
El evento grunt.event.on
detecta cambios en archivos, recibe un parámetro action
y filepath
.
Aquí hay un ejemplo no probado basado en uno de mis gruntfiles. En este caso, todos mis archivos fuente de coffeescript se guardan en un directorio llamado sources, y para la vista previa se compilan y guardan en una estructura de directorio idéntica bajo un directorio llamado dev
SOURCES_DIR = ''sources''
DEV_DIR = ''dev''
grunt.initConfig
watch :
all :
files : ["**/*.coffee"]
coffee :
dev :
files :
dest : "app.js"
grunt.loadNpmTasks ''grunt-contrib-watch''
grunt.loadNpmTasks ''grunt-contrib-coffee''
grunt.registerTask ''build'', [''coffee:dev'']
grunt.event.on(''watch'', (action,filepath) ->
# Determine the full directory of the changed file
wdi = filepath.lastIndexOf ''/''
wd = filepath.substring 0,wdi
# remove `sources` prefix from that directory
fpath = wd.replace(SOURCES_DIR,'''') + ''/''
# determine the filename
fnamei = filepath.lastIndexOf ''.''
fname = filepath.substring wdi+1,fnamei # NOTE: this breaks the case where in same dir
# concatenate fpath and fname with the dir to be compiled into
deststr = "#{DEV_DIR}#{fpath}#{fname}.coffee"
# set coffee.dev.files value in the coffee task to have am entry of form {"destination":"source"}
obj = {}
obj[deststr] = filepath
grunt.config "coffee.dev.files", obj
# fire the coffee task
grunt.task.run "coffee"
)
Espero que ayude.
EDITAR: Probablemente no sea exactamente lo que quiere, porque sin duda quiere acceso a variables intermediarias, acciones, etc., pero podría usar gruñido para ejecutar un comando de shell de café. La tarea npm de grunt-shell
hace esto, por ejemplo
EDIT2: me he enfrentado a problemas continuos con grunt.watch.on
no funciona de manera consistente en grunt 0.4.1 en OSX 10.8 y MacVim 7.3; por alguna razón, deja de mirar. Volví a utilizar simplemente el objeto básico initConfig gruñido, pero con mucha más granularidad, por lo que solo observa y compila grupos relativamente pequeños de archivos en lugar de todo el lote. Esto ralentiza considerablemente el tiempo de construcción, pero es mucho más robusto. Tu kilometraje puede muy.
Soy nuevo en Grunt, y hasta ahora lo estoy disfrutando mucho. Quiero que Grunt compile solo los archivos modificados cuando ejecuta el grunt watch
En mi Grunfile.coffee actualmente tengo (partes relevantes).
Nota: assets / javascript / app.coffee y assets / javascript / app.js son directorios
coffee:
default:
expand: true
cwd: "assets/javascript/app.coffee"
src: ["*.coffee"]
dest: "assets/javascript/app.js"
ext: ".js"
uglify:
dev:
options:
beautify: true
compress: false
mangle: false
preserveComments: ''all''
files:
"js/app.js": "assets/javascript/app.js/*.js"
"js/libs.js": "assets/javascript/libs/*.js"
watch:
coffeescript:
files: ''assets/javascript/**/*.coffee''
tasks: ["coffee"]
javascript:
files: "assets/**/*.js"
tasks: ["uglify:dev"]
livereload:
files: ["Gruntfile.coffee", "js/*.js", "*.php", "css/*.css", "images/**/*.{png,jpg,jpeg,gif,webp,svg}", "js/*.js", ]
options:
livereload: true
Probablemente hay un camino más corto, pero estoy compilando app.coffee para app.js primero, para que después de distribuir mi trabajo, las personas que no estén cómodas con Coffeescript puedan navegar por el código de una manera razonable.
El problema con todo esto es que ahora que guardo un archivo Coffeescript, tengo demasiados pasos (creo):
>> File "assets/javascript/app.coffee/browse.coffee" changed.
Running "coffee:default" (coffee) task
File assets/javascript/app.js/browse.js created.
File assets/javascript/app.js/filters.js created.
Done, without errors.
Completed in 0.837s at Tue May 28 2013 12:30:18 GMT+0300 (EEST) - Waiting...
OK
>> File "assets/javascript/app.js/browse.js" changed.
>> File "assets/javascript/app.js/filters.js" changed.
Running "uglify:dev" (uglify) task
File "js/app.js" created.
File "js/libs.js" created.
Done, without errors.
Completed in 0.831s at Tue May 28 2013 12:30:19 GMT+0300 (EEST) - Waiting...
OK
>> File "js/app.js" changed.
>> File "js/libs.js" changed.
Completed in 0.000s at Tue May 28 2013 12:30:19 GMT+0300 (EEST) - Waiting...
Actualmente estoy configurando mi proyecto, pero tendré muchos más archivos Coffeescript, y no quiero que Coffeescript recompile todos los archivos, en cada cambio de archivo.
Además, libs.js no tiene nada que ver con todo esto, pero creo que todavía está compilado, porque también coincide con el patrón "assets / * / .js".
¿Hay alguna manera de hacer que Grunt compile solo los archivos que han cambiado?
Si combina todas las fuentes de café en un solo archivo .js, deberá volver a compilarlo siempre que cambie alguna de sus fuentes. Divídelo en varios archivos .js y realice una tarea de lanzamiento donde solo concature estos archivos .js. De esta forma, solo necesita incluir un archivo .js.
Consulte Uso de gruntjs, ¿cómo observar los cambios en los archivos de café?
También me encontré con esto y no encontré ninguna versión funcional que funcionara con la versión actual (0.4.1) Pero la respuesta de Jof Arnolds mostró un buen enfoque.
Esto es lo que se me ocurrió:
# only recompile changed files
grunt.event.on "watch", (action, filepath) ->
# note that we have to manually change the target file name to
# our desired format
targetName = filepath.replace(///(client|shared)/, "")
.replace(".coffee", ".js")
.replace("app/", "")
options =
src: filepath
dest: "public/javascripts/#{targetName}"
grunt.config ["coffee", "client"], options
Tengo una sección de café que se parece a esto:
coffee:
client:
options:
sourceMap: false
files: [
expand: true
cwd: "app"
src: ["*/client/**/*.coffee", "helpers/{client,shared}/*.coffee"]
dest: "public/javascripts"
rename: (folder, name) ->
name = name.replace(///(client|shared)/, "")
[folder, name].join path.sep
ext: ".js"
]
¡Finalmente encontré una solución real! ¡Y es muy simple también!
npm install grunt-newer --save-dev
Luego en tu Gruntfile (después de cargar la tarea en gruñido):
watch:
coffeescript:
files: ''assets/javascript/**/*.coffee''
tasks: ["newer:coffee"]
¡Y eso es! ¡The Awesome grunt-newer es increíble!