Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以将一个标志传递给Gulp,让它以不同的方式运行任务?_Javascript_Node.js_Gulp - Fatal编程技术网

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

Javascript 是否可以将一个标志传递给Gulp,让它以不同的方式运行任务?,javascript,node.js,gulp,Javascript,Node.js,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.SCS

正常情况下,一口气完成的任务如下所示:

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));
});
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(这不是任务)并让它基于此有条件地运行任务?比如说

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

Gulp没有为此提供任何类型的util,但是您可以使用许多命令args解析器之一。我喜欢。应该是:

var argv=require('yargs')。argv;
gulp.task('my-task',function()){
return gulp.src(argv.a==1?options.SCSS_源:options.OTHER_源)
.pipe(sass({style:'nested'}))
.pipe(autoprefixer('last 10 version'))
.pipe(concat('style.css'))
.管道(大口目的地(选项SCSS_目的地));
});
您还可以将其与有条件地管道化流相结合,这对于开发人员与产品构建非常有用:

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/'));
});
并使用
gulpmyjstask
gulpmyjstask--production调用

gulp util
是而且应该避免的,因此建议改用已经使用过的
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
。它在较新的版本中已被弃用,因此必须使用gulp util。任务如下所示:

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));
});
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
我的风格任务也很有效

再见
拉尔夫

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

gulpfile.js CLI 原始参考(不再可用):

最小值选择 从更新的参考文件:

gulpfile.js CLI 如果您有一些严格的(有序的!)参数,那么只需检查
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;
}
好了,现在就够了。。。下面是一个使用gulp的简单示例:


运行它
gulp--env production

有一种非常简单的方法可以在不解析参数的情况下执行
打开/关闭
标记
gulpfile.js
只是一个像其他文件一样执行的文件,因此您可以执行以下操作:

var flags = {
  production: false
};

gulp.task('production', function () {
  flags.production = true;
});
如果
有条件地执行一个步骤,则使用类似于
gulpif的方法

gulp.task('build', function () {
  gulp.src('*.html')
    .pipe(gulp_if(flags.production, minify_html()))
    .pipe(gulp.dest('build/'));
});

执行
gulp-build
将生成一个漂亮的html,而
gulp-production-build
将缩小它。

我构建了一个插件,将命令行中的参数注入到任务回调中

gulp.task('mytask', function (production) {
  console.log(production); // => true
});

// gulp mytask --production

如果有人发现一个bug或对它有改进,我很乐意合并PRs。

从命令行传递参数 然后大口喝下:

$ gulp scripts --env development


CLI
gulp production
调用我的生产任务并为任何条件设置标志。

我们希望为不同的环境传递不同的配置文件--一个用于生产开发测试。这是gulp文件中的代码:

//将标志传递给gulp以设置环境
//var env=gutil.env.env;
if(typeof gutil.env.env==='string'){
process.env.NODE_env=gutil.env.env;

}
如果您使用的是typescript(
gulpfile.ts
),那么请为
yargs
(基于@Caio Cunha的优秀答案和上面的其他评论):

安装
.ts
文件 将其添加到.ts文件:

import { argv } from 'yargs';

...

  let debug: boolean = argv.debug;
这必须在每个.ts文件中单独完成(即使是导入到
gulpfile.ts/js
中的
tools/tasks/project
文件)

跑 或者在
npm
下将arg传递给gulp:

npm run build.dev -- --debug

这个问题发布已经有一段时间了,但也许它会帮助一些人

我使用的是GULP CLI 2.0.1(全球安装)和GULP 4.0.0(本地安装),以下是无需任何额外插件即可实现的方法。我认为这段代码是不言自明的

var cp = require('child_process'), 
{ src, dest, series, parallel, watch } = require('gulp');

// == availableTasks: log available tasks to console
function availableTasks(done) {
  var command = 'gulp --tasks-simple';
  if (process.argv.indexOf('--verbose') > -1) {
    command = 'gulp --tasks';
  }
  cp.exec(command, function(err, stdout, stderr) {
    done(console.log('Available tasks are:\n' + stdout));
  });
}
availableTasks.displayName = 'tasks';
availableTasks.description = 'Log available tasks to console as plain text list.';
availableTasks.flags = {
  '--verbose': 'Display tasks dependency tree instead of plain text list.'
};
exports.availableTasks = availableTasks;
并从控制台运行:

gulp availableTasks
然后运行并查看差异:

gulp availableTasks --verbose

由于它在节点中运行,您可能可以使用
process.argv
来访问命令行参数,正如您在运行它时从控制台日志消息中看到的那样。他们要求您使用自己的解析器并建议
yargs
minimist
。谢谢@caioton的提示。我已经更新了我的答案和我的项目;)您可以缩短
util.env.theme吗?util.env.theme:'main'
util.env.theme | |'main'
。反正+1。
gulputil
利用
minimist
库进行命令行参数解析。因此,如果您使用的是
gulputil
,则不需要额外的库。文档:这应该被提到@governmental gulp github,必不可少的东西!这段视频解释了如何在没有yargs的情况下实现这一点:Hi@plankguy,这段视频非常好。谢谢它展示了如何手工解析环境变量,而无需任何库。一个小的区别是视频是关于环境变量的,而上面的示例是关于命令行参数的,其中,Yargs是另一个通过抽象变量解析来帮助简化消耗的工具。如果您使用
npm run gulp
,那么您应该像
npm run gulp--production
一样使用它。这里提到了@the(字面意思)。该配方链接现在似乎不见了。还有一个使用minimist包来代替:。这是有道理的,因为gulp本身。好主意,使用yargs节省,我已经扩展了它,通过一个“预生产”任务来设置变量,然后“生产”有一个['build','pre-production']的依赖数组。这样你就可以进行“大口生产”了。太好了!我在设置流之前使用它,使用
gulp.task('mytask',function(){if(flags.myflag){flaggedtask}else{unflaggedask})我认为这是一种简单的方法
var isProduction = (process.argv.indexOf("production")>-1);
npm install --save-dev yargs

typings install dt~yargs --global --save
import { argv } from 'yargs';

...

  let debug: boolean = argv.debug;
gulp build.dev --debug
npm run build.dev -- --debug
var cp = require('child_process'), 
{ src, dest, series, parallel, watch } = require('gulp');

// == availableTasks: log available tasks to console
function availableTasks(done) {
  var command = 'gulp --tasks-simple';
  if (process.argv.indexOf('--verbose') > -1) {
    command = 'gulp --tasks';
  }
  cp.exec(command, function(err, stdout, stderr) {
    done(console.log('Available tasks are:\n' + stdout));
  });
}
availableTasks.displayName = 'tasks';
availableTasks.description = 'Log available tasks to console as plain text list.';
availableTasks.flags = {
  '--verbose': 'Display tasks dependency tree instead of plain text list.'
};
exports.availableTasks = availableTasks;
gulp availableTasks
gulp availableTasks --verbose