在另一个NodeJS进程中执行JS文件(带有日志等)

时间:2017-10-01 02:45:41

标签: javascript node.js asynchronous command-line-interface

这是我的问题,我想创建一个自动运行测试的CLI。如果没有CLI,我可以使用node命令完美地运行所有内容:

node test.js

基本上,我想做与之前命令完全相同的事情,所以我搜索了一种技术来做到这一点。我发现了这个:

#!/usr/bin/env node
'use strict';
 const options = process.argv;
 const { execFile } = require('child_process');
 const child = execFile('node', ['../dist/test.js'], (error, stdout, stderr) => {
     if (error) {
        throw error;
     }
     console.log(stdout);
 });

此方法对我不起作用,因为在test.js文件中,我使用的是ora包。因为这个软件包正在制作实时动画,所以它不会出现在stdout

有没有办法使用Node实时执行(没有子进程)my test.js?我对其他方法持开放态度,但我想在NPM上发布CLI,所以请记住它必须是在JavaScript中。

您可以在GitHub找到我在此处讨论的每个文件。通常情况下,您不需要此链接,但如果您需要仔细查看,我会将其提供给您。

3 个答案:

答案 0 :(得分:0)

在需要定义它的模块后,您应该只需从CLI代码中调用test()函数。看看mocha和jasmine:你会看到虽然这两个工具都提供了CLI,但它们也提供了从任意JS代码调用测试框架的指令。

答案 1 :(得分:0)

我想不出没有子流程的方法。但这可能有所帮助。 子进程exec不能使用连续输出命令,因为它缓冲了输出,当缓冲区已满时,进程将暂停。

合适的解决方案是spwan

var spwan = require('child_process').spwan
var child = spwan('node', ['../dist/test.js'])

child.stdout.on('data', function(data) {
  console.log(data)
})

child.stderr.on('data', function(data) {
  console.log(data)
})

答案 2 :(得分:0)

这是我的解决方案,您可以使用fs库来获取文件的代码,然后,只需使用eval在同一进程中执行。

const fs = require("fs");

function run(file) {
    fs.readFile(file, (err, data) => {
        eval(data.toString('utf8'))
    })
}