我编写了一个脚本,它将异步执行多个 Angular CLI 命令(即ng build或ng test)。这样做的目的是让我们可以同时在不同的角度项目上执行这些功能。这有效,但不是这些命令的输出的部分不会记录到控制台。这基本上就是我正在做的事情(这段代码由 NodeJS 执行):const exec = require('child_process').exec;async function execute(cmd) { return new Promise(function(resolve, reject) { exec(cmd, (err, stdout, stderr) => { if (err) { reject(err); } else { resolve({ stdout, stderr }); } }); });}function executeCommandAsync(cmd) { const projects = ['proj1', 'proj2']; // arbitrary list, we get it in a different way projects.forEach(project => { console.log(`Executing command '${cmd}' on project ${project}...`); execute(`${cmd} ${project}`) .then(() => console.log( `Successfully executed command '${cmd}' on project '${project}'!` ) ) .catch(err => { console.log( `Error occurred executing '${cmd}' command on project '${project}'` ); console.log(`${err}`); }); });}所以在上面的例子中,我可以传入一个命令来在所有项目上执行,即'ng build'。控制台中的结果是这样的:Executing command 'ng build' on project 'proj1'...Executing command 'ng build' on project 'proj2'...Successfully executed command 'ng build' on project 'proj1'!Successfully executed command 'ng build' on project 'proj2'!这里缺少的是ng build命令的输出。有没有办法可以在这些命令运行时将它们的输出记录到控制台,或者您是否只能在承诺得到解决后才记录输出?除了将承诺本身记录到控制台之外,我还没有得到任何东西。我唯一的想法是命令是在与当前控制台不同的上下文中执行的,因此不会记录输出,但我不确定如何解决这个问题。
1 回答
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
万千封印
TA贡献1891条经验 获得超3个赞
不要使用exec. 使用spawnwhich 是一个EventEmmiter对象。然后您可以在stdout/ stderrevents( spawn.stdout.on('data',callback..))发生时收听它们。
来自 NodeJS 文档:
var spawn = require('child_process').spawn,
ls = spawn('ls', ['-lh', '/usr']);
ls.stdout.on('data', function (data) {
console.log('stdout: ' + data.toString());
});
ls.stderr.on('data', function (data) {
console.log('stderr: ' + data.toString());
});
ls.on('exit', function (code) {
console.log('child process exited with code ' + code.toString());
});
exec 缓冲输出并通常在命令执行完成后返回它。
添加回答
举报
0/150
提交
取消