在 node.js 脚本中异步运行 shell.js 命令以在终端中显示反馈

问题描述

几天前,我创建了一个 shell 脚本,用于根据用户菜单中选择的内容构建不同的应用程序(React、Vite-React、Vite-Vue、Next.js 和 Django)。

它确实很好用,但想尝试对 node.js 做同样的事情。结果目前“正常”工作,但虽然它产生了所需的最终结果,但它有一些限制,我想知道如何排序:

  1. 在脚本执行其工作时没有用户反馈。这是因为我同步运行命令。这对用户来说不太好,他们可能认为脚本只是停止了。我很想显示一个微调器或简单地将当前进程回显到终端,例如 yarnnpm do。

  2. 该脚本目前仅支持 MacOs/Linux,因为它依赖于 Homebrew 来安装几个软件包(jqpipenv)。我还没有看到如何使它也“对 Windows 友好”!

例如 installDjango() 函数,它同步运行所有命令:( 从而阻塞终端直到完成。我很想知道如何显示所有命令的终端输出,或者至少是一些微调器,让用户知道安装正在进行中:

import chalk from "chalk";
import { spawnSync } from "child_process";
import { sync as commandExists } from "command-exists";
import shell from "shelljs";
import { brewInstall,pipenvInstall } from "./utils.js";

const installDjango = (name) => {
  if (!commandExists("brew")) {
    brewInstall();
  }

  if (!commandExists("pipenv")) {
    pipenvInstall();
  }
  shell.echo(chalk.cyan(`Installing ${name}. Please hold...`));
  shell.mkdir(name);
  shell.cd(`./${name}`);
  spawnSync("gh",["repo","clone","GBrachetta/boilerplate-django","."]);
  spawnSync("rm",["-rf",".git"]);
  spawnSync("pipenv",["install"]);
  spawnSync("pipenv",["install","--dev"]);
  spawnSync("pipenv",[
    "run","python","manage.py","rename","boilerplate",name,]);
  spawnSync("git",["init"]);
  spawnSync("git",["add","."]);
  spawnSync("git",["commit","-m","'Initial commit'"]);
  spawnSync("code",["."]);
};

export default installDjango;

这里是引用的两个函数

import chalk from "chalk";
import { spawn } from "child_process";
import { Spinner } from "cli-spinner";
import shell from "shelljs";
const spinner = new Spinner("%s");
spinner.setSpinnerString(18);

export const brewInstall = () => {
  shell.echo(chalk.cyan("Brew does not exist. Installing..."));
  const brewInstall = spawn("/bin/bash",[
    "-c","$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)",]);
  brewInstall.stdout;
};

export const pipenvInstall = () => {
  shell.echo(chalk.cyan("pipenv does not exist. Installing..."));
  const pipenvInstall = (command,onSuccess) => {
    return new Promise((resolve,reject) => {
      const process = spawn(command,{ shell: true });
      spinner.start();
      process.on("exit",() => {
        spinner.stop();
      });
    });
  };
  const pipenvI = async () => {
    await pipenvInstall("brew install pipenv");
  };
  pipenvI();
};

如果您想查看完整包以获取更多上下文,this is the link to the repo

非常欢迎所有的建议和批评(这是我的第一个 node.js 脚本)!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)