前言:
新手误区:
一个简单的cli:
bin:
package.json 中有一个 bin 字段,指定各个内部命令对应的可执行文件的位置。 在包安装时,如果是全局安装,npm 将会把 package.json里定义的 bin 文件软连接到全局 node_modules/bin,如果是非全局安装,会软链接到项目文件夹./node_modules/.bin/。 根据下面代码的配置,当我们全局安装此包后,在任意位置运行 cli-test,都会执行全局 node_modules 中的 cli-test 文件。
/*cli-test 的 package.json*/"bin": { "cli-test": "./bin/cli-test" }
如果我们把cli安装在项目A node_modules中,通过设置项目中 package.json 的 scripts,运行 npm run cli,npm 就会在项目的 node_modules/.bin 寻找并运行cli-test 文件。
/*项目A package.json*/"scripts": { "cli": "cli-test" }
cli文件:
下面是 cli-test 文件,第一行必写,是告诉Unix和Linux系统这个文件中的代码用node可执行程序去运行它。 后面就做我们要做的事情就行了 。
#!/usr/bin/env node//do something
好了,到这里我们的cli就完成了。 其实有很多三方cli也并没有用类似 commander 的 node 库,如果我们的 cli 足够简单,以上这样就可以了。 下面接着讲 commander。
commander:
现在我们先写一个简单的文件来理解(也推荐先自行预览一下 commander 官方文档),下面是 bin 文件夹的 cli-test,代码如下:
#!/usr/bin/env node const program =require('commander'); program .usage('[option]', '--type required') .option('--type [typeName]', 'type: dev && build') .parse(process.argv); const {type} = program; if(type == 'dev'){ console.log('do something', type) }else if(type == 'build'){ console.log('do something', type) }else{ console.log('params error'); program.help(); }
解释一下上面的代码,从查看源码里发现 require('commander') 会 new一个commander 内部的单例对象并返回,program 已经是一个实例,
。 .usage 仅仅描述了参数规则,会在 --help 中打印出来。.option 定义了一个参数名和描述, parse 会解析命令之中的参数,根据上面定义好的规则执行相关命令。 比如上面的代码定义了 option 类型的参数 --type,执行 .parse 的时候,parse 根据 process.argv

