2013-09-05 3 views
15

Ho scritto una funzione che vorrei utilizzare come attività di Grunt. Posso fare questo con l'aggiunta di questo al Gruntfile:Registrazione di attività di Grunt il cui codice si trova in file JavaScript esterni

grunt.registerTask('foo', function() { 
    // code here 
}); 

Tuttavia, ha più senso per mantenere il codice di funzione in un file separato. Ho intenzione di definire un gruppo di questi compiti personalizzati e non voglio far ingrossare il Gruntfile.

Non sono sicuro di quale sia il modo preferito di registrare tali attività. Ho trovato questo per lavoro:

grunt.registerTask('foo', function() { 
    require('./path/to/foo.js')(grunt); 
}); 

Quindi, sto avendo la funzione inline come nell'esempio pugno, ma questa volta, mi sto caricando un file esterno e invocando immediatamente. In quel file esterno, ovviamente, devo scrivere:

module.exports = function (grunt) { 
    // code here 
} 

Questo funziona, ma sembra di essere hacker. C'è un modo più corretto per farlo?

risposta

22

Risposta breve: l'alternativa a questo

grunt.registerTask('foo', function() { 
    require('./path/to/foo.js')(grunt); 
}); 

è http://gruntjs.com/api/grunt#grunt.loadtasks

Risposta lunga:

Normalmente, quando si hanno compiti in file esterni vengono serviti come moduli altri nodejs. Quindi, se questo è qualcosa che userete in diversi progetti, potreste volerlo registrare nel registro. Più tardi all'interno del vostro Gruntfile.js si avrà:

grunt.loadNpmTasks('yout-module-here'); 

documentazione del grugnito dice:

Load tasks from the specified Grunt plugin. This plugin must be installed locally via npm, and must be relative to the Gruntfile 

Tuttavia, se non si desidera caricare qualsiasi cosa al Registro di sistema si dovrebbe usare loadTasks

grunt.loadTasks('path/to/your/task/directory'); 

Quindi, una volta caricato l'attività, è possibile utilizzarlo nella configurazione.

Ecco un compito semplice grugnito posto in file esterno:

'use strict'; 

module.exports = function(grunt) { 

    grunt.registerMultiTask('nameoftask', 'description', function() { 

     var self = this; 

     // this.data here contains your configuration 

    }); 
}; 

E più tardi nel Gruntfile.js

grunt.initConfig({ 
    nameoftask: { 
     task: { 
      // parameters here 
     } 
    } 
}); 
+0

E come faccio a riscrivere la mia funzione come compito? Quale sarebbe la configurazione più semplice. Ho solo una funzione che voglio associare a un nome in modo da poterlo richiamare con 'grunt name' nella riga di comando. –

+0

Ho appena modificato la mia risposta. – Krasimir

+0

Ho provato questo modello. Non funziona. Prendo 'Warning: Task" foo "non trovato. Nella riga di comando. Ho provato a specificare il percorso sia con un ''// ', che porta '/' e senza quelli. –

0

Ho avuto un problema simile.

Volevo modulare la mia configurazione di grunt e le attività personalizzate per funzionalità (grandi blocchi UX/UI) piuttosto che per caratteristiche tecniche. E volevo conservare i file di configurazione accanto ai file di attività ... (meglio quando lavoravo su una base di codice legacy con un team vario - 5 persone con diverse conoscenze JS)

Così ho esternalizzato i miei compiti come faceva Krasimir.

Nel gruntfile, ho scritto:

//power of globbing for loading tasks 
var tasksLocations = ['./grunt-config/default_tasks.js', './grunt-config/**/tasks.js']; 

var taskFiles = grunt.file.expand({ 
    filter: "isFile" 
    }, tasksLocations); 

taskFiles.forEach(function(path) { 
    grunt.log.writeln("=> loading & registering : " + path); 
    require(path)(grunt); 
}); 

Troverete tutto il boilerplate gruntfile qui (config e le attività esterne di carico):https://gist.github.com/0gust1/7683132

+0

Errore durante la registrazione delle attività "Attività". Inizializzazione della configurazione ... OK Caricamento attività "scp.js" ... OK >> Nessuna attività registrata o non registrata. 'Caricamento attività" Gruntfile.js "... ERRORE' – shab