一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情 。
今天的主要目的是完成读取配置文件的函数封装, 和封装命令行的交互函数。
读取配置文件
新建readconfig.ts文件,这里使用readFileSync读取,避免异步,设置encoding为utf-8,可以获得deploy-config.json的内容,使用JSON.parse将读取的数据转换为变量,这里使用try catch捕获错误的原因是: 当文件不存在时,在macOS、Linux 和 Windows下会报错。
/*
* @Author: Aisanyi
* @Date: 2022-04-05 11:54:30
* @LastEditors: Aisanyi
* @LastEditTime: 2022-04-05 12:28:04
* @Description: 读取配置文件
*/
import chalk from "chalk";
import { readFileSync } from "fs";
export function readConfig() {
let data: string = "{}";
try {
data = readFileSync("deploy-config.json", {
encoding: "utf-8",
});
} catch {
console.error(
chalk.red(
`读取文件失败, 请检查是否有 ${chalk.blue(
"deploy-config.json"
)} 文件, 没有请运行 ${chalk.green("deploy-cli init")} 命令`
)
);
}
return JSON.parse(data);
}
测试函数是否运行正常
在 index.ts 文件中新增测试函数的命令。
import { readConfig } from "./readconfig.js";
// 测试命令
program
.command("test")
.description("测试一些函数")
.action(() => {
const config = readConfig();
console.log(config)
});
运行 pnpm test , 运行 deploy-cli test, 结果如下(无配置文件的情况):
接下来运行
deploy-cli init、 deploy-cli test,无报错。
封装交互
使用readline模块封装,解说一个info提示, 然后等待用户的输入,
/*
* @Author: Aisanyi
* @Date: 2022-04-05 13:17:57
* @LastEditors: Aisanyi
* @LastEditTime: 2022-04-05 13:24:53
* @Description: 交互
*/
import { createInterface } from "readline";
export function echo(info: string) {
return new Promise((res) => {
const readL = createInterface({
input: process.stdin,
output: process.stdout,
});
readL.question(info, (answer) => {
readL.close();
res(answer);
});
});
}
测试
调整index.ts的测试命令
// 测试命令
program
.command("test")
.description("测试一些函数")
.action(() => {
const config = readConfig();
console.log(config)
echo('请输入你的用户名: ').then(res => {
console.log(res)
})
});
运行 pnpm test , 运行 deploy-cli test, 结果如下: