¿Cómo modificar las tareas de grunt watch según el archivo cambiado?

Estoy escribiendo un programa node.js que verá un directorio lleno de una gran cantidad de proyectos scss (300-ish). Grunt-watch (ejecutado a través del módulo de nodo o por su cuenta, lo que sea que funcione) se configurará de modo que cada vez que se cambie un archivo scss, se compile con brújula, el archivo de salida se mueva a un directorio separado, por ejemplo:

./1234/style.scss fue cambiado >> grunt-watch ejecuta grunt-compass >> /foo/bar/baz/1234/style.css actualizado

El directorio del proyecto en el que estaba el archivo es obviamente muy importante (si grunt-compass enviaba todos los archivos compilados al mismo directorio, serían confusos e inutilizables y la automatización del gruñido no tendría sentido). Para asegurarme de que todos los archivos se enruten al lugar correcto, estoy cambiando dinámicamente la configuración de grunt-brújula cada vez que se actualiza un archivo css.

Archivo de muestra:

module.exports = function(grunt) {

grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    watch: {
      files: './*/*.scss',
      tasks: ['compass']
    },
    compass: {
      origin:{
        options: {
          //temportary settings to be changed later
          sassDir: './',
          cssDir: './bar',
          specify: './foo.scss'
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-contrib-compass');

  grunt.event.on('watch', function(action, filepath, target) {
    var path = require('path');
    grunt.log.writeln(target + ': ' + filepath + ' might have ' + action);
    var siteDirectory = path.dirname(filepath);

    //changes sass directory to that of the changed file
    var option = 'compass.origin.options.sassDir';
    var result = __dirname + '/' + siteDirectory;
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //customizes css output directory so that file goes to correct place
    option = 'compass.origin.options.cssDir';
    result = path.resolve(__dirname, '../', siteDirectory);
    grunt.log.writeln(option + ' changed to ' + result);
    grunt.config(option, result);

    //grunt.task.run(['compass']);

  });

};

Sin embargo, esto no funciona. Si ejecuta 'grunt watch' en modo detallado, verá que grunt ejecuta tanto la función grunt.event.on como la tarea del reloj en procesos separados. El segundo análisis de gruntfile revierte todos mis cambios de configuración de event.on a los valores predeterminados anteriores, y la brújula no se ejecuta.

Como se ve en los comentarios de event.on, intenté agregar un grunt.task.run () para asegurarme de que la brújula se ejecutó en el mismo proceso que la función event.on, lo que preservaría mis cambios de configuración. Sin embargo, la tarea se negó a ejecutar, probablemente porqueLo estoy haciendo mal.

Desafortunadamente, las variables grunt.event.on no se envían a la tarea de vigilancia de gruñidos definida, de lo contrario podría escribir una función personalizada que cambiaría la configuración de la brújula y luego ejecutaría la brújula en el mismo proceso.

He intentado implementar esto sin gruñir, usando la función watch en la brújula, sin embargo, la brújula solo puede almacenar una ruta de salida estática por proyecto y solo puede ver un proyecto a la vez.

Actualmente he solucionado este problema agregando un programa de nodo que toma el nombre del sitio como parámetro, reescribe el archivo grunfile.js ejecutando fs, y luego ejecutando 'grunt watch' a través de una función exec. Sin embargo, esto tiene sus propios inconvenientes (no puedo ver los datos de grunt.log) y está terriblemente enrevesado, así que me gustaría cambiarlo.

Muchas gracias por cualquier idea.

Respuestas a la pregunta(1)

Su respuesta a la pregunta