专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  清华大学:DeepSeek + ... ·  2 天前  
程序员的那些事  ·  OpenAI ... ·  昨天  
OSC开源社区  ·  宇树王兴兴早年创业分享引围观 ·  3 天前  
程序猿  ·  “未来 3 年内,Python 在 AI ... ·  4 天前  
51好读  ›  专栏  ›  SegmentFault思否

从 1 到完美,用 node 写一个命令行工具

SegmentFault思否  · 公众号  · 程序员  · 2018-10-12 08:00

正文

1. package . json 中的 bin 字段

现在,不管是前端项目还是 node 项目,一般都会用 npm 做包管理工具,而 package . json 是其相关的配置信息。

node 项目而言,模块导出入口文件由 package . json main 字段指定,而如果是要安装到命令行的工具,则是由 package . json bin 字段指定。

1.1 配置单个命令

与包名同名

  1. {

  2.  "name": "pro",

  3.  "bin": "bin/pro.js"

  4. }

这样安装的命令名称就是 pro

自定义命令名称(与包名不同名)

  1. {

  2.  "name": "pro-cli",

  3.  "bin": {

  4.    "pro": "bin/pro.js"

  5.  }

  6. }

这样安装的命令名称也是 pro

1.2 配置多个命令
  1. {

  2.  "name": "pro-cli",

  3.  "bin": {

  4.    "pro": "bin/pro.js",

  5.    "mini": "bin/mini.js"

  6.  }

  7. }

这样安装就有 pro mini 两个命令。

2. 对应 bin / pro . js 文件的写法

  1. #!/usr/bin/env node

  2. require('../lib/pro');

与普通的 js 文件写法一样,只是前面要加上 #!/usr/bin/env node

这段前缀代码叫 shebang ,具体可以参考 Shebang (Unix) - Wikipedia。

3. 安装方式

3.1 全局安装
  1. npm i -g pro-cli

这种安装方式可以在命令行全局使用。

  1. pro dev

  2. pro build

3.2 本地安装
  1. npm i --save-dev pro-cli

这种安装方式需要配合 npm 一起使用,比如:

  1. # package.json

  2. {

  3.  "scripts": {

  4.    "dev": "pro dev",

  5.    "build": "pro build"

  6.   }

  7. }

  8. # 使用

  9. npm run dev

  10. npm run build

4. 选择合适的命令行封装库

一般来说,一个命令都会有如下的一些参数:

  • - v , -- version - V , -- version :查看版本号

  • - h , -- help :查看帮助信息

如果完全自己来写的,就会很麻烦,尤其是帮助信息。所以,选择一个好的命令行封装库,能够帮我们省去很多工作。

用的比较多的:

  • commander.js

  • yargs

  • meow

commander . js 为例。

4.1 安装
  1. npm install commander --save

4.2 注册
  1. const commander = require('commander');

注册版本号与描述:

  1. commander

  2.  .version('0.0.1')

  3.  .description('A cli application named pro');

注册参数(非子命令参数):

  1. commander

  2.  .option('-p, --peppers', 'Add peppers')

  3.  .option('-P, --pineapple', 'Add pineapple')

  4.  .option('-b, --bbq-sauce', 'Add bbq sauce')

  5.  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')

注册子命令:

  1. commander

  2.  .command('rm

    ')

  3.  .option('-r, --recursive', 'Remove recursively')

  4.  .action((dir, cmd) => {

  5.    console.log('remove ' + dir + (cmd.recursive ? ' recursively' : ''))

  6.  })

解析:

  1. commander.parse(process.argv);

4.3 使用

查看版本号:

  1. pro -V

  2. pro --version

  3. # 打印结果

  4. 0.0.1

运行 rm 子命令:

  1. pro rm dir

查看帮助( commander 会自动生成):

  1. pro -h

  2. pro --help

  3. # 打印结果

  4. Usage: pro [options]

  5. A cli application named pro

  6. Options:

  7.  -h, --help           output usage information

  8.  -V, --version        output the version number

  9.  -p, --peppers        Add peppers

  10.  -P, --pineapple      Add pineapple

  11.  -b, --bbq            Add bbq sauce

  12.  -c, --cheese  Add the specified type of cheese [marble]

  13.  -C, --no-cheese      You do not want any cheese

更多用法查看 commander.js。

5. 常用的命令行相关工具库

5.1 minimist 解析命令行的参数
  1. var argv = require('minimist')(process.argv.slice(2));

  2. console.dir(argv);

  1. $ node example/parse.js -a beep -b boop

  2. { _: [], a: 'beep', b: 'boop' }

  1. $ node example /parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz

  2. { _: [ 'foo', 'bar', 'baz' ],

  3.  x: 3,

  4.  y: 4,

  5.  n: 5,

  6.  a: true,

  7.  b: true,

  8.  c: true,

  9.  beep: 'boop' }

更多参考 minimist。

5.2 chalk: 让命令行的字符带上颜色

更多参考 chalk。

5.3 Inquirer.js 让命令行与用户进行交互,如输入、选择等。

更多参考 Inquirer.js。

5.4 shelljs 跨平台 Unix shell 命令 的 node 封装
  1. var shell = require('shelljs');

  2. if (!shell







请到「今天看啥」查看全文