使用
一个公司,大概率上,会定义很多开发规则,而且在开发习惯上也会有很多相似的地方。这样每个项目类似的目录结构和配置。每一次搭建新项目就需要重新写一遍,这即“重复性工作”。为了减少这些“重复性工作”,cli(command line interface)出现,少量的参数即可自动搭建出一个项目雏形。著名的CLI有vue-cli,create-react-app等
利用node的npm来实现一个cli非常简单而且使用也非常方便
首先创建一个npm包,
npm init
当前目录下会出现package.json
在package.json下添加“bin”属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"name": "idkhts-cli-demo",
"version": "1.0",
"description": "lll",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hgg",
"license": "ISC",
//添加bin
"bin":{
"cli":"./index.js"
}
}package.json的bin是npm提供的一个把执行文件快速注册到PATH的便捷方式,npm在下载的时候就会把bin属性下的值——执行的文件,符号链接(软链)到
- 并且添加到npm的PATH路径变量下——全局安装
./node_modules/.bin
——局部安装
全局安装后,执行对应的命令,
cli
,命令行后会查询PATH然后找到对应的文件执行;若是局部安装,直接执行命令
cli
会报错,因为在PATH路径变量中并没有存在对应的可执行文件或软链。这种情况只能自己复制或者使用npm run
,在package.json文件的scripts属性加上自己的命令,如1
2
3
4
5
6
7
8
9
10
11
12
13
14// package.json
{
...
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
//添加自定义命令
"nrcli":"cli"
},
...
//添加bin
"bin":{
"cli":"./index.js"
}
}局部安装会把bin的定义的key生成文件名,所以在scripts定义的命令内容也是写cli,因为npm run是自动去寻找
./node_modules/.bin
文件,所以执行npm run nrcli
意为“执行文件./node_modules/.bin/cli”接下来,定义入口文件。因为前面只是配置了命令执行什么文件,但是系统还不知道要怎么执行文件,这样如果不是可执行文件都会报错。配置用node.js执行,在入口文件的顶部加上:
index.js
1
2#! /usr/bin/env node
// do something ...这样,当系统执行文件时,读取第一行就知道当前文件应该在node环境下执行。
推送到npm:
npm publish
使用
- 局部安装
- 安装
npm i <cli-name> --save-dev
- 修改package.json的
script
属性: 添加"nr-cmd":"cli-cmd"
- 执行
npm run nr-cmd
- 安装
- 局部安装
全局安装:
- 安装
npm i <cli-name> -g
- 执行命令
<cli-name>
即可
随记
比较好用的开发命令行工具的包commdaner.js,
- version可以这样定义
program.version(require("./package.json").version)
自动和package.json的version对应 - 没有定义的命令,自带提示“错误命令”;自带
-h | --help
命令支持 - 踩过的坑是,最后一定要执行一句
program.parse(process.argv)
- version可以这样定义
npm发布前想要在本地测试,可以使用命令
npm link
在需要发布的npm包目录下,执行命令
npm link
,然后npm就会把当前包生成软链添加到npm的全局路径下,并且添加入口文件的软链放npm的PATH路径变量下。若是写的包有定义bin属性,npm link
就可以直接执行命令了;若不是cli类的,需要加载到某个具体项目使用的,可以再在需要使用的项目根目录,执行命令
npm link <package-name>
,加载到具体的目录上;因为是软链,当在具体项目中
npm link <packge-name>
加载了某个本地npm包,然后在项目中修改node_module中依赖会直接修改本地npm包npm link
的效果其实和npm i -g
是一样的,只是前者来源是本地,后者是npm服务器;npm link
生成的是软链,所以本地修改包的效果会直接同步(本来就是执行本地的文件)
参考
最后更新: 2021年07月15日 23:55
原始链接: https://idkhts.github.io/2021/01/19/node%E5%BC%80%E5%8F%91cli/