【问题标题】:Convert the following npm script to gulp task将以下 npm 脚本转换为 gulp 任务
【发布时间】:2017-12-13 19:32:29
【问题描述】:

我有以下 npm 脚本要转换为 gulp 任务

  "scripts": {
    "lint": "eslint .",
    "start": "npm run build:sdk && node .",
    "posttest": "npm run lint && nsp check",
    "build:sdk": "./node_modules/.bin/lb-sdk server/server.js ./client/src/app/shared/sdk"
  },

现在我希望 gulp 任务具有与 npm start 相同的功能。但我无法完成任务,因为它将运行 npm run build:sdk 然后 node 。

这是我到目前为止所做的。

gulp.task('default', function() {
  gulp.run('sdk');
  gulp.run('server');
  gulp.watch(['./common/models/*.js'], function() {
    gulp.run('server');
  });
});

gulp.task('server', function() {
  if (node) node.kill();
  node = spawn('node', ['server/server.js'], {stdio: 'inherit'});
  node.on('close', function(code) {
    if (code === 8) {
      gulp.log('Error detected, waiting for changes...');
    }
  });
});

gulp.task('sdk', function() {
  spawn('./node_modules/.bin/lb-sdk server/server.js ./client/src/app/shared/sdk');
});

堆栈跟踪

Error: spawn ./node_modules/.bin/lb-sdk server/server.js ./client/src/app/shared/sdk ENOENT
    at exports._errnoException (util.js:1050:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:193:32)
    at onErrorNT (internal/child_process.js:367:16)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)
    at Module.runMain (module.js:607:11)
    at run (bootstrap_node.js:423:7)
    at startup (bootstrap_node.js:147:9)
    at bootstrap_node.js:538:3

【问题讨论】:

  • 尝试将参数作为数组传递:spawn('./node_modules/.bin/lb-sdk', ['server/server.js ./client/src/app/shared/sdk']);
  • 其实我需要依次运行这两个进程,首先是 sdk,然后是服务器
  • 我是说您的spawn 语句调用是错误的。这就是你得到Error: spawn ./node_modules/.bin/lb-sdk server/server.js ./client/src/app/shared/sdk ENOENT 的原因。参数应作为数组传递。

标签: javascript node.js npm gulp


【解决方案1】:

您的代码中有两个问题。首先,您将参数作为数组传递给生成的进程。

gulp.task('sdk', function() {
      spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q']);
});

其次,您正在使用gulp.run('sdk');,它已被弃用。当您解决上述问题时,您必须在控制台中看到这一点。为此,您必须将依赖项传递给您的 default 任务以及 gulp.watch()

gulp.task('default', ['sdk', 'server'] , function() {
  gulp.watch(['./common/models/*.js'], ['server']);
});

完成 Gulp 文件

var gulp = require('gulp');
var {spawn} = require('child_process');

var node = null;

gulp.task('default', ['sdk', 'server'], function() {
  gulp.watch(['./common/models/*.js'], ['server']);
});

gulp.task('server', function() {
  if (node) node.kill();
  node = spawn('node', ['server/server.js'], {stdio: 'inherit'});
  node.on('close', function(code) {
    if (code === 8) {
      gulp.log('Error detected, waiting for changes...');
    }
  });
});

gulp.task('sdk', function() {
  spawn('./node_modules/.bin/lb-sdk', ['server/server.js', './client/src/app/shared/sdk', '-q']);
});

【讨论】:

  • 其实我需要依次运行这两个进程,首先是 sdk,然后是服务器
  • 是的,它们按照要求按顺序运行。请参阅随附的屏幕截图。我还在答案中附上了完整的 gulpfile。
  • address in use error 即将到来,因为其他进程正在使用您的端口号。杀死其他进程并重新开始。
  • 处理现在正在运行,但 sdk 没有效果它没有创建它应该创建的文件?
  • 您期待什么样的文件以及它会生成什么?
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2014-09-07
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多