从 gulp 运行 shell 命令

Posted

技术标签:

【中文标题】从 gulp 运行 shell 命令【英文标题】:Running a shell command from gulp 【发布时间】:2015-06-13 05:23:32 【问题描述】:

我想从 gulp 运行一个 shell 命令,使用 gulp-shell。我看到 gulpfile 使用了以下成语。

这是从 gulp 任务运行命令的惯用方式吗?

var cmd = 'ls';
gulp.src('', read: false)
    .pipe(shell(cmd, quiet: true))
    .on('error', function (err) 
       gutil.log(err);
);

【问题讨论】:

【参考方案1】:

gulp-shell 已被列入黑名单。您应该改用gulp-exec,它也有更好的文档。

对于您的情况,它实际上说明了:

注意:如果你只是想运行一个命令,只运行命令,不要使用这个插件:

var exec = require('child_process').exec;

gulp.task('task', function (cb) 
  exec('ping localhost', function (err, stdout, stderr) 
    console.log(stdout);
    console.log(stderr);
    cb(err);
  );
)

【讨论】:

gulp-shell has been blacklisted: 你这是什么意思? Gulp 提供了一个不是以“Gulp 方式”编写的包的黑名单。在此处查看列表:github.com/gulpjs/plugins/blob/master/src/blackList.json 传递给exec 的函数不会向 Gulp 记录任何内容。为什么没有发生这种情况? 您在回答“只需运行命令”中的意思是什么......如果没有这样的插件,我如何通过 gulp 任务运行命令? (必须是一项任务,因为 gulp.watch 在每次文件更改时都会调用它 更新:仍然没有记录任何东西。【参考方案2】:

保持控制台输出相同的新方法(例如,使用颜色):

见:https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

var gulp = require('gulp');
var spawn = require('child_process').spawn;

gulp.task('my-task', function (cb) 
  var cmd = spawn('cmd', ['arg1', 'agr2'], stdio: 'inherit');
  cmd.on('close', function (code) 
    console.log('my-task exited with code ' + code);
    cb(code);
  );
);

【讨论】:

但是如果你在 Windows 上要小心,因为 spawn() 不能可靠地工作,请参阅this Node issue 这是 imo +1 的最佳答案 这个解决方案在 Windows 上对我不起作用,但在这里找到了另一个解决方案 - ***.com/questions/45841902/… 优秀的答案!我发现并创建了一个更详细的方法 (gist.github.com/rmckeel/b4e60922f5098ced9c50bdd96731b34a/…),但我使用继承 stdio 概念 (gist.github.com/rmckeel/b4e60922f5098ced9c50bdd96731b34a) 更新了该代码示例,因为它很优雅,应该适用于大多数用途。谢谢!【参考方案3】:

使用gulp 4,您的任务可以直接返回子进程来表示任务完成:

'use strict';

var cp = require('child_process');
var gulp = require('gulp');

gulp.task('reset', function() 
  return cp.execFile('git checkout -- .');
);

gulp-v4-running-shell-commands.md

【讨论】:

Gulp 4 是芝诺悖论的现代化身。 较新的 Gulp 版本不会像这样使用gulp.task。如果它不适合您,请尝试 cp.exec 而不是 cp.execFile【参考方案4】:

你可以这样做:

const  spawn  = require('child_process');
const gulp = require('gulp');

gulp.task('list', function() 
    const cmd = spawn('ls');
    cmd.stdout.on('data', (data) => 
        console.log(`stdout: $data`);
    );
    return cmd;
);

【讨论】:

【参考方案5】:

根据 Gulp 的文档,你可以像这样运行echo 这样的命令:

const cp = require('child_process');

function childProcessTask() 
  return cp.exec('echo *.js');


exports.default = childProcessTask;

exec 接受一个将由 shell 解析的字符串,默认情况下它会静音输出。

我个人喜欢改用child_process.spawnspawn 接受命令的名称,然后是参数列表。如果您使用选项stdio: 'inherit',它不会吞下它的输出。

function childProcessTask() 
  return cp.spawn('echo', ['one', 'two'], stdio: 'inherit');

参考资料:

Gulp 文档:Returning a child process 节点文档:child_process.exec(command, options, callback) 节点文档:child_process.spawn(command, args, options)

【讨论】:

以上是关于从 gulp 运行 shell 命令的主要内容,如果未能解决你的问题,请参考以下文章

Husky 和 ​​lint-staged 无法运行 gulp 命令

安装 Gulp 后:“找不到命令 'gulp'”

本地安装的 gulp 不在命令行中运行?

gulp安装成功命令却无法执行的解决办法 gulp command not find

gulp 命令不起作用

在 NPM 包安装后运行 gulp 任务,无需任何命令