2013-07-29 12 views
5

Sto scrivendo un programma node.js che guarderà una directory riempita con una grande quantità (300-ish) di progetti scss. Grunt-watch (eseguito tramite il modulo del nodo o da solo, qualunque cosa funzioni) verrà configurato in modo che ogni volta che un file scss viene modificato, verrà compilato con la bussola, il file di output spostato in una directory separata, ad esempio:Come modificare le attività dell'orologio grunt in base al file modificato?

./1234/style.scss è stato cambiato >> grugnito-orologio corre grugnito-bussola >> /foo/bar/baz/1234/style.css aggiornato

directory del progetto che il file era in è ovviamente molto importante (se grunt-compass ha inviato tutti i file compilati nella stessa directory, essi sarebbero confusi e inutilizzabili e l'automazione del grunt non avrebbe voluto). Per assicurarmi che tutti i file siano indirizzati al posto giusto, sto cambiando dinamicamente le impostazioni della bussola grunt ogni volta che un file css viene aggiornato.

gruntfile Esempio:

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']); 

    }); 

}; 

Tuttavia questo non funziona. Se si esegue 'grunt watch' in modalità dettagliata, si vedrà che grunt esegue sia la funzione grunt.event.on che l'attività watch in processi separati. Il secondo parsing del gruntfile ripristina tutto il mio evento.Per config modifiche alle impostazioni predefinite di cui sopra, e bussola non riesce a funzionare.

Come si è visto nei commenti event.on, ho tentato di aggiungere un grunt.task.run() per fare in modo che la bussola è stato eseguito nello stesso processo, come la funzione event.on, che avrebbe preservare i miei cambiamenti di configurazione. Tuttavia, l'attività si è rifiutata di essere eseguita, probabilmente perché I'm doing it wrong.

Sfortunatamente, le variabili grunt.event.on non vengono inviate al task grunt-watch definito, altrimenti potrei scrivere una funzione personalizzata che cambierebbe le impostazioni della bussola e quindi eseguirò la bussola nello stesso processo.

Ho provato a implementarlo senza grugnito, utilizzando la funzione di orologio incorporata nella bussola, tuttavia la bussola può solo memorizzare un percorso di uscita statico per progetto e può solo guardare un progetto alla volta.

Attualmente ho risolto questo problema aggiungendo un programma nodo che prende il nome del sito come parametro, riscrive grunfile.js eseguendo utilizzando fs e quindi eseguendo "grunt watch" tramite una funzione exec. Questo però ha i suoi svantaggi (non riesco a visualizzare i dati di grunt.log) ed è orribilmente contorto, quindi mi piacerebbe cambiarlo.

Grazie mille per qualsiasi intuizione.

+0

Questo non risponde alla tua domanda, ma perché c'è un grunt-contrib-watch per la bussola? La bussola è già fornita con 'bussola orologio ' – pllee

+0

Devi specificare' opzioni: {nospawn: true} 'nella tua attività di configurazione orologio per fare in modo che' watch' venga eseguito nello stesso contesto ([vedi questa sezione in docs] (https://github.com/gruntjs/grunt-contrib-watch#compiling-files-as-needed)). –

+0

@ go-oleg Grazie! Funziona meravigliosamente. Sono sorpreso di non averlo visto nei documenti, poiché afferma direttamente che 'nospawn' risolve problemi come il mio. – anachronism

risposta

11

È necessario specificare

options : { nospawn : true }

nel vostro orologio compito config per avere la corsa orologio nello stesso contesto:

watch: { 
    files: './*/*.scss', 
    tasks: ['compass'], 
    options : { nospawn : true } 
} 

Vedi this section di documentazione per maggiori informazioni su questo.

+0

Apprezzata questa risposta. Aveva letto la documentazione ma non era chiaro sul significato di "contesto" e su come era influenzato dall'opzione 'nospawn'. Grazie! – jerome

+0

Grazie per la risposta! – vgrinko

+2

Per aggiungere un aggiornamento a questa risposta, a partire da giugno 2016 l'opzione è ora: 'spawn: false' – BigHeadCreations

Problemi correlati