这是我的问题,我想创建一个自动运行测试的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找到我在此处讨论的每个文件。通常情况下,您不需要此链接,但如果您需要仔细查看,我会将其提供给您。
答案 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'))
})
}