2014-11-19 2 views
12

Я разделил свой gulpfile.js на несколько файлов в папке /gulp, чтобы упорядочить код немного лучше. Но теперь я хочу передать переменную debug (boolean) в файлы, которые будут переключать поведение включенной команды gulp (в конечном итоге я буду использовать аргументы командной строки, но пока я просто хочу заставить ее работать с переменной).Node.js: как передать глобальную переменную в файл, вставленный через require()?

Путь Я получил эту установку, используя метод, который я видел в пакете угловой/глотком YEOMAN, использует модуль НПМ под названием require-dir (который загружает все * .js файлы в папке /gulp, где каждый имеет набор заданий gulp, которые установлены).

gulpfile.js:

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

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

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

Что бы загрузить что-то вроде ...

Глоток/build.js:

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

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

Так что, когда я запускаю команду gulp , который запускает задание default, он загрузит build.js, а затем выполнит e Задача gulp build. Но, к сожалению, кажется, что debug возвращает undefined.

Как я могу заставить это работать?

Я смотрел, используя только module.exports() и require() метод узла, но я не мог понять, как получить задание глотка внутри включаемого файла, чтобы объявить, чтобы он мог затем запустить из главного gulpfile.js файла (в желаемую последовательность).

Может ли кто-нибудь помочь? Спасибо

ответ

9

Нормальный способ модуля, действительно. Просто измените этот gulp/build.js файл из фактически не экспортирует ничего к собственно требуется, умелый модуль:

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

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

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

, а затем вызвать его в основном файле как:

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

Итак, теоретически после запуска метода loadGulp() 'задача gulp должна быть зарегистрирована, поэтому я должен буду запускать' gulp.start ('build') ', и он будет доступен ...? – BuildTester1

+1

правильный. операция 'require ('require-dir/gulp') теперь загружает функцию, и теперь выполнение этих функций регистрирует задачу gulp, после чего ее можно вызывать как любую другую. –

+0

Есть ли способ сделать требуемый файл self init при импорте, поэтому мне не нужно вызывать функцию? то есть. 'require ('gulp/build.js');' вместо 'var build = require ('gulp/build.js')'? – BuildTester1

6

Node.js предлагает единственную глобальную переменную с именем global, которая, по сути, является одним и тем же экземпляром во всех модулях (в отличие от module, который отличается в каждом модуле). Установив значения на global, они становятся действительно глобальными. В качестве дополнительного бонуса вам не нужен префиксный доступ к глобальным переменным с global.. Оба global.foo и только foo эквивалентны, если у вас нет другой переменной с именем foo в области.

+0

Это действительно плохая идея, e особенно если какой-либо другой модуль вступает в глобальное состояние. Вы никогда не должны загрязнять глобальное состояние, просто заставьте ваш модуль возвращать функцию генератора, в которую вы передаете свои аргументы, чтобы получить полностью квалифицированную функцию, которую вам действительно нужно выполнить. –

+0

Хотя я, конечно, согласен с тем, что вы вообще хотите избегать глобалов, насколько это возможно, бывают моменты, когда они полезны и уместны. Тем не менее, удобно знать, как это сделать в узле. –

+0

Это не одно такое время. –

1

Я просто создать один объект со всеми переменными в нем я экспортирую как модуль, чтобы я мог использовать его во всех моих файлах задач. Например

JS/Задачи/variables.js

module.exports = { 
    myBool: true 
}; 

JS/задач/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/Задачи/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

Тогда вы можете получить/установить эти переменные из любого места:

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'); 
}); 
Смежные вопросы