初步探索使用nodeJs + ts编写cli命令行工具

1,807 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

创建项目

初始化

mkdir deploy-cli
cd deploy-cli
pnpm init || npm init

得到的package.json内容如下

{
  "name": "@deploy/cli",
  "version": "0.0.1",
  "description": "快速部署项目到测试环境",
  "main": "index.ts",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

安装一些依赖

pnpm add typescript -D
pnpm add @types/node -D
pnpm add chalk

生成 Typescript 的配置文件

tsc --init 

typescript.json中设置的 "outDir ": "bin"

试运行

  1. 创建src目录, 目录下创建index.ts, 测试代码如下
import chalk from 'chalk';

console.log(chalk.blue('Hello world!'));

此时ts会报错: image.png 我们需要把typescript.json设置"moduleResolution": "node"

如果想要直接运行ts文件, 我们需要安装 ts-node, 这里我直接安装到全局

pnpm add ts-node -g

接下来运行 ts-node .\src\index.ts,报错信息如下: image.png 通过查看报错信息, 我们需要将"type": "module",添加到package.json中,再次运行 ts-node .\src\index.ts命令。 image.png 这个报错是因为ts-node esm支持现阶段是实验性质的, 详情查看:github.com/TypeStrong/…。我们需要将命令修改为ts-node --esm .\src\index.ts, 结果如下: image.png

到这里试运行的阶段就结束了。

安装依赖

commander

commander.js 是完整的node.js命令行解决方案。详情点击 github

首先安装commander

pnpm add commander

根据手册, 在src/index.ts文件里书写引入示例,

import { Command } from "commander";
const program = new Command();
program.version(`0.0.1`, "-v, --version", "查看版本号")

输入 ts-node --esm .\src\index.ts --help命令, 结果如下: image.png

commander正常运行。

chalk

chalk的作用是: 让我们命令行的文字加上颜色。详情请看:chalk-npm

修改src/index.ts 为

import chalk from "chalk";
import { Command } from "commander";
const program = new Command();


program.version(`版本号: ${chalk.bold.green('0.0.1')}`, "-v, --version", "查看版本号")

program.parse(process.argv);

运行 ts-node --esm .\src\index.ts -v, 得到的结果如下:

image.png

字体成功修改,chalk运行正常。

精简命令

我感觉每次都到输入一大串命令有点不优雅, 所以我们我们把命令写进脚本里,在package.json文件里script选项中添加 "dev": "ts-node --esm .\\src\\index.ts "。 运行pnpm dev -h,结果如下:

image.png

并没有输出帮助信息, 这里要注意, 如果要传参,需要添加--, 所以正确的命令应该是pnpm dev -- -h, 结果如下

image.png

测试命令是否可用

  1. 运行tsc,将typescript打包到bin文件夹。
  2. 使用link命令,将npm 模块链接到全局。
pnpm link -g
  1. 运行 deploy-cli -v, 结果正常

image.png

文章有误的地方,欢迎掘友们指正,点个赞再走吧!