Подтвердить что ты не робот

Node.js: как передать глобальную переменную в файл, вставленный через require()?

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

Как я получил эту настройку, используя метод, который я видел в пакете yoman angular/gulp, использует модуль npm под названием 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', '...']);

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

gulp/build.js:

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

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

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

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

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

Может ли кто-нибудь помочь? Благодаря

4b9b3361

Ответ 1

Нормальный способ модуля, действительно. Просто измените этот файл 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);

Ответ 2

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

Ответ 3

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

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