Можно ли передать флаг в Gulp, чтобы он запускал задачи по-разному?
обычно в Gulp задачи выглядят так:
gulp.task('my-task', function() {
return gulp.src(options.SCSS_SOURCE)
.pipe(sass({style:'nested'}))
.pipe(autoprefixer('last 10 version'))
.pipe(concat('style.css'))
.pipe(gulp.dest(options.SCSS_DEST));
});
можно ли передать флаг командной строки в gulp (это не задача) и выполнить задачи условно на основе этого? Например,
$ gulp my-task -a 1
и затем в моем gulpfile.js:
gulp.task('my-task', function() {
if (a == 1) {
var source = options.SCSS_SOURCE;
} else {
var source = options.OTHER_SOURCE;
}
return gulp.src(source)
.pipe(sass({style:'nested'}))
.pipe(autoprefixer('last 10 version'))
.pipe(concat('style.css'))
.pipe(gulp.dest(options.SCSS_DEST));
});
10 ответов
Gulp не предлагает никакого util для этого, но вы можете использовать один из многих парсеров command args. Мне нравится yargs
. Должно быть:
var argv = require('yargs').argv;
gulp.task('my-task', function() {
return gulp.src(argv.a == 1 ? options.SCSS_SOURCE : options.OTHER_SOURCE)
.pipe(sass({style:'nested'}))
.pipe(autoprefixer('last 10 version'))
.pipe(concat('style.css'))
.pipe(gulp.dest(options.SCSS_DEST));
});
вы также можете объединить его с gulp-if
условно трубы поток, очень полезны для Дев и прод дом:
var argv = require('yargs').argv,
gulpif = require('gulp-if'),
rename = require('gulp-rename'),
uglify = require('gulp-uglify');
gulp.task('my-js-task', function() {
gulp.src('src/**/*.js')
.pipe(concat('out.js'))
.pipe(gulpif(argv.production, uglify()))
.pipe(gulpif(argv.production, rename({suffix: '.min'})))
.pipe(gulp.dest('dist/'));
});
С gulp my-js-task
или gulp my-js-task --production
.
редактировать
gulp-util
is устаревший и следует избегать, поэтому рекомендуется использовать minimist, который gulp-util
уже используется.
поэтому я изменил некоторые строки в моем gulpfile, чтобы удалить gulp-util
:
var argv = require('minimist')(process.argv.slice(2));
gulp.task('styles', function() {
return gulp.src(['src/styles/' + (argv.theme || 'main') + '.scss'])
…
});
Оригинал
в моем проекте я использую следующий флаг:
gulp styles --theme literature
Gulp предлагает объект gulp.env
для этого. Это устарело в newer версии, поэтому вы должны использовать gulp-util для этого. Задачи выглядят следующим образом:
var util = require('gulp-util');
gulp.task('styles', function() {
return gulp.src(['src/styles/' + (util.env.theme ? util.env.theme : 'main') + '.scss'])
.pipe(compass({
config_file: './config.rb',
sass : 'src/styles',
css : 'dist/styles',
style : 'expanded'
}))
.pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'ff 17', 'opera 12.1', 'ios 6', 'android 4'))
.pipe(livereload(server))
.pipe(gulp.dest('dist/styles'))
.pipe(notify({ message: 'Styles task complete' }));
});
параметр среды доступен во всех подзадачах. Поэтому я могу использовать этот флаг и в задаче watch:
gulp watch --theme literature
и моя задача стилей также работает.
Чао Ральф!--11-->
вот быстрый рецепт, который я нашел:
gulpfile.js
var gulp = require('gulp');
// npm install gulp yargs gulp-if gulp-uglify
var args = require('yargs').argv;
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');
var isProduction = args.env === 'production';
gulp.task('scripts', function() {
return gulp.src('**/*.js')
.pipe(gulpif(isProduction, uglify())) // only minify if production
.pipe(gulp.dest('dist'));
});
командной строки
gulp scripts --env production
оригинальный Реф (не больше): https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-params-from-cli.md
альтернатива с minimist
Из Обновленного Ref: https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md
gulpfile.js
// npm install --save-dev gulp gulp-if gulp-uglify minimist
var gulp = require('gulp');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');
var minimist = require('minimist');
var knownOptions = {
string: 'env',
default: { env: process.env.NODE_ENV || 'production' }
};
var options = minimist(process.argv.slice(2), knownOptions);
gulp.task('scripts', function() {
return gulp.src('**/*.js')
.pipe(gulpif(options.env === 'production', uglify())) // only minify if production
.pipe(gulp.dest('dist'));
});
командной строки
gulp scripts --env production
есть очень простой способ сделать on/off
флаги без разбора аргументов. gulpfile.js
- это просто файл, который выполняется, как и любой другой, так что вы можете сделать:
var flags = {
production: false
};
gulp.task('production', function () {
flags.production = true;
});
и использовать что-то вроде gulp-if
условно выполнить шаг
gulp.task('build', function () {
gulp.src('*.html')
.pipe(gulp_if(flags.production, minify_html()))
.pipe(gulp.dest('build/'));
});
выполнения gulp build
будет производить хороший html, в то время как gulp production build
уменьшит его.
если у вас есть строгие (заказанные!) аргументы, то вы можете получить их, просто проверив process.argv
.
var args = process.argv.slice(2);
if (args[0] === "--env" && args[1] === "production");
выполнить: gulp --env production
...однако, я думаю, что это ТООО строгий и не пуленепробиваемый! Так что я немного повозился... и закончил с этой функцией утилиты:
function getArg(key) {
var index = process.argv.indexOf(key);
var next = process.argv[index + 1];
return (index < 0) ? null : (!next || next[0] === "-") ? true : next;
}
он ест аргумент-имя и будет искать это в process.argv
. Если ничего не было найдено, он выплевывает null
. В противном случае, если их нет рядом аргумент или следующий аргумент-это команда, а не значение (мы отличаемся тире) true
возвращается. (Это потому, что ключ существует, но просто нет значения). Если все предыдущие случаи потерпят неудачу, следующий аргумент-значение-это то, что мы получаем.
> gulp watch --foo --bar 1337 -boom "Foo isn't equal to bar."
getArg("--foo") // => true
getArg("--bar") // => "1337"
getArg("-boom") // => "Foo isn't equal to bar."
getArg("--404") // => null
ладно, пока хватит... Вот простой пример использования залпом:
var gulp = require("gulp");
var sass = require("gulp-sass");
var rename = require("gulp-rename");
var env = getArg("--env");
gulp.task("styles", function () {
return gulp.src("./index.scss")
.pipe(sass({
style: env === "production" ? "compressed" : "nested"
}))
.pipe(rename({
extname: env === "production" ? ".min.css" : ".css"
}))
.pipe(gulp.dest("./build"));
});
запустить gulp --env production
Я построил плагин для ввода параметров из командной строки в обратный вызов задачи.
gulp.task('mytask', function (production) {
console.log(production); // => true
});
// gulp mytask --production
https://github.com/stoeffel/gulp-param
Если кто-то находит ошибку или имеет улучшение, я рад объединить PRs.
и если вы используете typescript (gulpfile.ts
) тогда сделайте это для yargs
(основываясь на отличном ответе @ Caio Cunha https://stackoverflow.com/a/23038290/1019307 и другие комментарии выше):
установить
npm install --save-dev yargs
typings install dt~yargs --global --save
.ts
файлы
добавить к этому .файлы TS:
import { argv } from 'yargs';
...
let debug: boolean = argv.debug;
это должно быть сделано в каждой .TS файл по отдельности (даже tools/tasks/project
файлы, которые импортируются в gulpfile.ts/js
).
выполнить
gulp build.dev --debug
или в npm
передайте арг через глотать:
npm run build.dev -- --debug
передать аргументы из командной строки
// npm install --save-dev gulp gulp-if gulp-uglify minimist
var gulp = require('gulp');
var gulpif = require('gulp-if');
var uglify = require('gulp-uglify');
var minimist = require('minimist');
var knownOptions = {
string: 'env',
default: { env: process.env.NODE_ENV || 'production' }
};
var options = minimist(process.argv.slice(2), knownOptions);
gulp.task('scripts', function() {
return gulp.src('**/*.js')
.pipe(gulpif(options.env === 'production', uglify())) // only minify in production
.pipe(gulp.dest('dist'));
});
затем запустите gulp с:
$ gulp scripts --env development
var isProduction = (process.argv.indexOf("production")>-1);
командной строки gulp production
называет мою производственную задачу и устанавливает флаг для любых условий.
мы хотели передать другой файл конфигурации для разных сред - один для производства, dev и тестирование. Это код в файле gulp:
//passing in flag to gulp to set environment
//var env = gutil.env.env;
if (typeof gutil.env.env === 'string') {
process.env.NODE_ENV = gutil.env.env;
}
Это код в приложении.файл js:
if(env === 'testing'){
var Config = require('./config.testing.js');
var Api = require('./api/testing.js')(Config.web);
}
else if(env === 'dev'){
Config = require('./config.dev.js');
Api = require('./api/dev.js').Api;
}
else{
Config = require('./config.production.js');
Api = require('./api/production.js')(Config.web);
}
а потом запустить его залпом --env=testing