如何解决在 node.js 脚本中异步运行 shell.js 命令以在终端中显示反馈
几天前,我创建了一个 shell 脚本,用于根据用户从菜单中选择的内容构建不同的应用程序(React、Vite-React、Vite-Vue、Next.js 和 Django)。
它确实很好用,但想尝试对 node.js
做同样的事情。结果目前“正常”工作,但虽然它产生了所需的最终结果,但它有一些限制,我想知道如何排序:
-
在脚本执行其工作时没有用户反馈。这是因为我同步运行命令。这对用户来说不太好,他们可能认为脚本只是停止了。我很想显示一个微调器或简单地将当前进程回显到终端,例如
yarn
或npm
do。 -
该脚本目前仅支持 MacOs/Linux,因为它依赖于
Homebrew
来安装几个软件包(jq
和pipenv
)。我还没有看到如何使它也“对 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 举报,一经查实,本站将立刻删除。