javascript - 如何在 gulp 任务中运行 shell 命令并检测它何时完成?
问题描述
我正在尝试使用在 gulp 任务中运行 shell 命令child_process.spawn
。
我必须检测任务何时完成运行,所以我stdout
用来检查我在命令末尾发出的特定字符串,但由于某种原因,它看起来不像我的字符串正在发出:
// gulp 3.9.1
var gulp = require('gulp');
var spawn = require('child_process').spawn;
gulp.task('my-task', function(cb) {
var command = ''; // construct my shell command here
var end = 'end_of_command';
var command = command + '; echo ' + end; // add special string to look for
var cmd = spawn(command, { shell: true });
cmd.stdout.on('data', function(data) {
if (data.includes(end)) {
return cb();
}
});
});
由于某种原因,我的 echo 语句没有发出,因此 if 语句没有被传递。
我哪里错了?
我还应该注意,当我直接在我的 shell 中而不是通过 gulp 任务运行这个命令时,它运行良好并且预期的输出是可见的。
解决方案
Gulp和异步函数都child_process
使用 Node 风格的错误优先回调。
spawn
用于在命令执行期间处理流。如果只需要等到命令完成,exec
然后execFile
执行此操作:
var gulp = require('gulp');
var exec = require('child_process').exec;
gulp.task('my-task', function(cb) {
exec('cmd', cb);
});
它可能更复杂,spawn
因为它还允许处理退出代码:
var gulp = require('gulp');
var spawn = require('child_process').spawn;
gulp.task('my-task', function(cb) {
spawn('cmd', [], {})
.on('error', cb)
.on('close', code => code ? cb(new Error(code)) : cb());
});
推荐阅读
- ruby-on-rails - 如何从 pg_search 多搜索中获取结果
- excel - 从 xml 文件中提取数据到 Excel 或 txt 文件
- sql - `?` 用于 SQL `IN` 条件的占位符,具有持久性的`rawSql`
- swift - 如何使用带有 UITabBarController 的 MVP 架构
- c++ - 在 UWP 应用程序中,future.wait() 在尝试同步来自异步方法的响应时一直等待
- jenkins - Automatically configure the docker cloud in Jenkins using groovy script
- android - 如何使用 EditText 停止正在运行的计时器?
- arrays - 当您在数组中执行 custum 对象时跳过 line powershell
- android - Android Firebase 上传图片的 URL 错误(问题:缺少 X-Goog-Upload-Comment 标头)
- laravel - Laravel 迁移 - 将 id 字段从整数自动增量更新为字符串