当前位置: 首页 > 知识库问答 >
问题:

是否可以将一个标志传递给Gulp,让它以不同的方式运行任务?

贝镜
2023-03-14

通常在大口大口的任务看起来像这样:

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

共有3个答案

叶元凯
2023-03-14

下面是我找到的一个快速配方:

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

从更新的参考文件:https://github.com/gulpjs/gulp/blob/master/docs/recipes/pass-arguments-from-cli.md

// 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
郑嘉悦
2023-03-14

编辑

gulp util已被弃用,应避免使用,因此建议改用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。它在较新版本中已被弃用,因此您必须使用gup-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' }));
});

环境设置在所有子任务期间可用。所以我也可以在监视任务中使用此标志:

gulp watch --theme literature

我的风格任务也有效。

再见,拉尔夫

颜宸
2023-03-14

Gulp没有为此提供任何类型的util,但是您可以使用许多命令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/'));
});

并调用吞下我的js任务吞下我的js任务--production

 类似资料:
  • 问题内容: 通常在Gulp中任务看起来像这样: 是否可以将命令行标志传递给gulp(这不是任务),并使其有条件地运行任务?例如 然后在我的gulpfile.js中: 问题答案: Gulp对此不提供任何实用程序,但是您可以使用许多命令args解析器之一。我喜欢。应该: 您还可以将其与有条件地传输流结合起来,这对于开发与生产产品非常有用: 并使用或致电。

  • 问题内容: 我有一个呼唤任务,称为其他呼唤任务。我想用编程确定的参数调用子任务。这可能吗?我花了一些时间来研究 lib / grunt.js 和 lib / grunt / task.js ,但无法弄清楚。 我正在使用 Gruntfile.js中*指定的以下参数: * 我希望能够在运行时覆盖它们: task / my-task.js : 以供参考: 问题答案: 我想到了。使用Gruntfile.j

  • 问题内容: 我想做这样的事情: 但是我得到这个错误 对成员’init()’的不明确引用 我知道我可以写 但是我想知道是否还有另一种方式。 问题答案: 问题在于不存在 仅 具有参数的初始化程序。 __ 目前只存在: 尽管该参数具有默认值,但是编译器仅在初始化程序的调用位置为您“填充”该默认值。 获取对函数本身的引用时,不会部分应用默认参数值,编译器也不会为默认参数值的所有可能组合生成额外的重载。后者

  • 问题内容: 我有一个带有一些componentDidMount逻辑的React组件: 是否可以通过props传递此组件,以便componentDidMount()中的所有内容都被执行,以某种方式伪造以便截取屏幕截图?遵循以下原则: 我知道我可以使用,但是我有一些复杂的登录逻辑,我想使用这样的快捷方式来避免,而是将所有需要的道具直接传递给组件? 问题答案: 在这里回答了这个问题。让我们在这里尝试相同

  • 这是我正在尝试解决的用例——这是我之前的线程Apache camel的扩展,用于聚合多个REST服务响应 我使用了具有自定义聚合策略的多播组件将传入请求分叉为子请求并聚合它们的响应。在这之前一切都很好。 现在,对于其中一个用例,我希望传入的URL参数有选择地传递给一些子服务。前任: 传入请求-http://[host]/my service/scan?foo=a 我的多播组件如下所示- 我想只传递

  • 问题内容: 从Redis文档上可以看到: 不应该代表键名 在Redis集群教程中 哈希标签记录在Redis Cluster规范中,但是要点是,如果密钥的{}中的括号之间有一个子字符串,则仅对字符串中的内容进行哈希处理,例如,此{foo}键和另一个{foo} key保证在同一哈希槽中,并且可以在以多个key作为参数的命令中一起使用。 是否可以仅传递哈希标签,或者仅传递带有该哈希标签的一个键?我们希望