1. D盘新创建一个文件夹my-cli
2. 切换到该文件夹,执行npm init -y初始化文件夹,这时候得到的package.json如下
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "name": "my-cli", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } |
3. 在当前目录下创建bin文件夹,并在里面创建一个my-cli的文件
先在文件中写入如下内容
1 2 |
#! /usr/bin/env node console.log("my-cli") |
第一行是告诉我们,执行这个文件时,使用node环境,也就是用node来执行后面的语句内容
4. 修改package.json,在里面添加bin字段,这个字段的用途,是用来告诉npm,当我们创建软连接时,需要链接到哪个文件
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "name": "my-cli", "version": "1.0.0", "description": "", "main": "index.js", "bin": "./bin/my-cli", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" } |
5. 在当前目录执行npm link 命令,为当前文件夹创建软连接,让全局的node能找到我们当前的目录,并能执行cli脚本,执行npm link时,默认注册的命令为package.json中的name字段
执行玩命令后,会输出类似下面的一条日志
1 2 |
C:\Users\liguixing\AppData\Roaming\npm\my-cli -> C:\Users\liguixing\AppData\Roaming\npm\node_modules\my-cli\bin\my-cli C:\Users\liguixing\AppData\Roaming\npm\node_modules\my-cli -> D:\my-cli |
代表软链创建成功。
如果中间某一步错了,需要重新创建软链,但由于执行过npm link,再次执行时会报如下的错误,
1 2 3 4 5 6 7 8 9 10 11 12 13 |
npm WARN my-cli@1.0.0 No repository field. up to date in 1.075s found 0 vulnerabilities npm ERR! code EEXIST npm ERR! path C:\Users\liguixing\AppData\Roaming\npm\node_modules\my-cli\bin\my-cli npm ERR! dest C:\Users\liguixing\AppData\Roaming\npm\my-cli npm ERR! EEXIST: file already exists, cmd shim 'C:\Users\liguixing\AppData\Roaming\npm\node_modules\my-cli\bin\my-cli' -> 'C:\Users\liguixing\AppData\Roaming\npm\my-cli' npm ERR! File exists: C:\Users\liguixing\AppData\Roaming\npm\my-cli npm ERR! Remove the existing file and try again, or run npm npm ERR! with --force to overwrite files recklessly. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\liguixing\AppData\Roaming\npm-cache\_logs\2021-05-16T03_05_20_105Z-debug.log |
这时只需在后面加上 –force参数即可,即npm link –force,意思是强制重新建立软链。
6. package.json中的bin字段也可以配置成对象的形式,让我们一次软链接多个文件,比如:
1 2 3 4 |
"bin":{ "my-cli": "./bin/my-cli", "my-cli-test": "./bin/my-cli-test" } |
这样之后,重新创建软链,则就有了 my-cli 和 my-cli-test 两个全局命令,并且执行这两个命令会执行不同的文件脚本。
有了上面的基础后,我们通过在脚本中进行参数解析,做一些响应的逻辑,就可以实现类似cli的相关功能了。
实现一个cli可能需要用到的包:
commander:解析参数,输出配置项相关信息,比如-h, -version等
chalk:实现对控制台输出的文字添加不同的颜色
inquirer:实现输出各种选项,并获去用户的选择结果
fs-extra:增强的 fs 模块,主要用于文件和文件夹的操作和判断
ora:用于输出一个加载loading
axios:用于根据url和参数请求资源
download-git-repo:用于下载git仓库资源
发表评论