2014-11-19 12 views
12

Ho diviso il mio gulpfile.js in diversi file in una cartella /gulp per organizzare il codice un po 'meglio. Ma ora voglio passare una variabile debug (boolean) nei file che cambieranno il comportamento del comando gulp incluso (eventualmente userò gli argomenti della riga di comando, ma per ora voglio solo farlo funzionare con una variabile).Node.js: come faccio a passare la variabile globale in un file inserito tramite require()?

Il modo in cui ho avuto questa configurazione, utilizzando un metodo che ho visto in un pacchetto angolare/sorso Yeoman, sta utilizzando un modulo NPM chiamato require-dir (che carica tutti i file * .js nella cartella /gulp, dove ognuno ha un set di compiti di gulp impostati).

gulpfile.js:

var gulp = require('gulp'), 
    run = require('run-sequence'), 
    debug = true; 

require('require-dir')('./gulp'); 

gulp.task('default', ['build', 'server', 'watch', '...']); 

Che sarebbe caricare qualcosa di simile ...

gulp/build.js:

var gulp = require('gulp'), 
    plumber = require('gulp-plumber'), 
    ...; 

gulp.task('build', function() { 
    console.log(debug); 
}); 

Così quando ho eseguito il comando gulp , che esegue l'attività default, caricherà build.js e quindi eseguirà e l'attività gulp build. Ma sfortunatamente, sembra che debug ritorni indefinito.

Come posso farlo funzionare?

stavo guardando utilizzando solo module.exports() e il metodo del nodo require(), ma non riuscivo a capire come ottenere il compito sorso all'interno del file incluso per dichiarare, in modo che potesse poi essere eseguito dal file principale gulpfile.js (in la sequenza desiderata).

Qualcuno può offrire assistenza? Grazie

risposta

9

Il modo normale del modulo, davvero. Basta cambiare il file gulp/build.js dalla realtà non esportare nulla ad un modulo corretto richiedere-grado:

module.exports = function(debug) { 
    "use strict"; 

    var gulp = require('gulp'), 
     plumber = require('gulp-plumber'), 
     ...; 

    gulp.task('build', function() { 
    console.log(debug); 
    }); 
}; 

e quindi chiamare nel file principale:

... 
var loadGulp = require('require-dir/gulp'); 
... 
var debug = true; 
loadGulp(debug); 
+1

Quindi, teoricamente, dopo aver eseguito il metodo 'loadGulp()', il task gulp dovrebbe essere registrato, quindi dovrei essere in grado di eseguire 'gulp.start ('build')' e sarà disponibile ...? – BuildTester1

+1

corretto. l'operazione 'require ('require-dir/gulp')' ora carica una funzione, e l'esecuzione di tali funzioni ora registra il task gulp, dopodiché può essere chiamato come qualsiasi altro. –

+0

C'è un modo per rendere il file richiesto auto init al momento dell'importazione, quindi non devo chiamare la funzione? vale a dire. 'require ('gulp/build.js');' invece di 'var build = require ('gulp/build.js')'? – BuildTester1

6

Node.js offre una singola variabile globale denominata global che è, in effetti, la stessa istanza in tutti i moduli (a differenza di module, che è diversa in ogni modulo). Impostando i valori su global diventano veramente globali. Come bonus aggiuntivo, non è necessario l'accesso al prefisso alle variabili globali con global.. Entrambi global.foo e solo foo sono equivalenti fino a quando non si dispone di un'altra variabile denominata foo in ambito.

+0

questa è una pessima idea, e specialmente se qualsiasi altro modulo tocca lo stato globale. Non si dovrebbe mai inquinare lo stato globale, basta fare in modo che il modulo restituisca una funzione generatore in cui si passano i propri argomenti, per ottenere la funzione pienamente qualificata che è effettivamente necessario eseguire. –

+0

Mentre sono certamente d'accordo sul fatto che in genere si voglia evitare il più possibile i globali, ci sono momenti in cui sono entrambi utili e appropriati. Detto questo, è utile sapere come farlo in Node. –

+0

questo non è uno di questi tempi. –

1

ho appena creare un oggetto con tutte le variabili in esso che esporto come modulo in modo da poterlo utilizzare in tutti i miei file di attività. Per esempio

JS/attività/variables.js

module.exports = { 
    myBool: true 
}; 

js/attività/sass.js

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    log = $.util.log, 
    vars = require('./variables'); 

gulp.task('sass', function() { 
    log('myBool: ' + vars.myBool); // logs "myBool: true" 
    vars.myBool = false; 
}); 

JS/attività/build.js

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    log = $.util.log, 
    vars = require('./variables'); 

gulp.task('build', function() { 
    log('myBool: ' + vars.myBool); // logs "myBool: false" 
}); 

/gulpfile.js

allora si può ottenere/impostare quelle variabili da qualsiasi luogo:

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    runSequence = require('run-sequence'), 
    vars = require('./js/tasks/variables'), 
    requireDir = require('require-dir')('./js/tasks'); 

gulp.task('production', function(){ 
    runSequence('sass', 'build'); 
}); 
Problemi correlati