【问题标题】:Execute a JS file (with logs, etc...) inside another NodeJS process在另一个 NodeJS 进程中执行一个 JS 文件(带有日志等)
【发布时间】:2017-10-01 02:45:41
【问题描述】:

这是我的问题,我想创建一个自动运行测试的 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 实时(无子进程)执行我的 test.js?我对其他方法持开放态度,但我想在 NPM 上发布 CLI,所以请记住它必须在 JavaScript 中????。

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

【问题讨论】:

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


    【解决方案1】:

    在需要定义它的模块之后,您应该简单地从 CLI 代码中调用您的 test() 函数。看看 mocha 和 jasmine:你会发现虽然这两个工具都提供了 CLI,但它们还提供了从任意 JS 代码调用测试框架的说明。

    【讨论】:

    • 嗯,不,因为我的test.js 不是一个函数,而是一组操作,我可以将所有内容打包到一个函数中,但这不是我想要的。只有在没有其他方法的情况下我才会这样做
    • 拥有多个功能并不重要。我的意思是您的 CLI 是 JS 代码,它可以要求您的核心测试框架模块并使用它。你在同一个代码库中,所以你可以简单地 require 本地模块。如果其他人正在开发 CLI,他会做一个 npm install 来添加对您的测试框架的依赖,然后会从他的代码中调用您的函数/类。
    • 我找到了一个更好的解决方案:见顶部 ;)
    【解决方案2】:

    我想不出没有子流程的方法。但这可能会有所帮助。 子进程 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)
    })
    

    【讨论】:

    • 您可以通过data.toString('utf8')轻松将其转换为字符串
    • 谢谢,但我找到了更好的解决方案
    【解决方案3】:

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

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

    【讨论】:

    • 请记住,不建议使用evalDocs 还有这个question
    猜你喜欢
    • 2012-10-09
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2011-12-31
    • 2023-03-16
    • 2012-05-18
    相关资源
    最近更新 更多