2013-06-09 7 views
17

Ho un progetto con diverse sottocartelle che contengono file JavaScript che voglio concatenare. quale sarebbe il modo giusto per configurarli?Mappatura dinamica per destinazioni in grunt.js

es.

fonte: /modules/$modulename/js/*.js (diversi file) dest: /modules/$modulename/js/compiled.js

Quindi quello che voglio fare è compilare JS- file di un conteggio delle sottocartelle sconosciuto/non configurato ($ modulename) in un file per sottocartella.

È possibile?


la seguente funzione (costruita dopo le istruzioni del hereandnow78) fa il lavoro:

grunt.registerTask('preparemodulejs', 'iterates over all module directories and compiles modules js files', function() { 

    // read all subdirectories from your modules folder 
    grunt.file.expand('./modules/*').forEach(function(dir){ 

     // get the current concat config 
     var concat = grunt.config.get('concat') || {}; 

     // set the config for this modulename-directory 
     concat[dir] = { 
      src: [dir + '/js/*.js', '!' + dir + '/js/compiled.js'], 
      dest: dir + '/js/compiled.js' 
     }; 

     // save the new concat config 
     grunt.config.set('concat', concat); 

    }); 

}); 

dopo che ho messo preparemodulejs prima che il lavoro concat nella mia configurazione di default.

risposta

32

sarà probabilmente necessario codificare la propria attività, in cui si esegue l'iterazione sulle sottocartelle e si aggiungerà dinamicamente alla configurazione di concat.

grunt.registerTask("your-task-name", "your description", function() { 

    // read all subdirectories from your modules folder 
    grunt.file.expand("./modules/*").forEach(function (dir) { 

    // get the current concat config 
    var concat = grunt.config.get('concat') || {}; 

    // set the config for this modulename-directory 
    concat[dir] = { 
    src: ['/modules/' + dir + '/js/*.js', '!/modules/' + dir + '/js/compiled.js'], 
    dest: '/modules/' + dir + '/js/compiled.js' 
    }; 

    // save the new concat configuration 
    grunt.config.set('concat', concat); 
    }); 
    // when finished run the concatinations 
    grunt.task.run('concat'); 
}); 

run questo con:

$ grunt your-task-name 

questo codice non è testato, ma penso che dovrebbe fare il tuo lavoro.

SUGGERIMENTO: puoi inserire questo codice in un file esterno e includerlo nel tuo gruntfile se vuoi mantenere il tuo gruntfile piccolo, ad es. mettere questo in un file all'interno di una task-directory:

module.exports = function(grunt) { 
    grunt.registerTask("your-task-name", "your description", function() { 
    ... 
    }); 
}; 

e caricare in nel vostro gruntfile:

grunt.loadTasks("./tasks"); 
+0

@ hereannow78 questo approccio è grande, ho completamente dimenticato che posso leggere nella struttura di file. inserirò un aggiornamento nella domanda su quale funzione funziona. – Patrick

+0

+1 per suggerire la directory 'tasks'. Ci sono troppi Gruntfile gonfiati là fuori. – ZenMaster

+0

Questo è abbastanza vecchio, esiste un modo per escludere le cartelle dalla directory principale? – pcnate

Problemi correlati