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

简介:

1. package.json 中的 bin 字段

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

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

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. }

这样安装就有 promini 两个命令。

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 <dir>')

  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 <type>  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.which('git')) {

  3.  shell.echo('Sorry, this script requires git');

  4.  shell.exit(1);

  5. }

  6. // Copy files to release dir

  7. shell.rm('-rf', 'out/Release');

  8. shell.cp('-R', 'stuff/', 'out/Release');

  9. // Replace macros in each .js file

  10. shell.cd('lib');

  11. shell.ls('*.js').forEach(function (file) {

  12.  shell.sed('-i', 'BUILD_VERSION', 'v0.1.2', file);

  13.  shell.sed('-i', /^.*REMOVE_THIS_LINE.*$/, '', file);

  14.  shell.sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, shell.cat('macro.js'), file);

  15. });

  16. shell.cd('..');

  17. // Run external tool synchronously

  18. if (shell.exec('git commit -am "Auto-commit"').code !== 0) {

  19.  shell.echo('Error: Git commit failed');

  20.  shell.exit(1);

  21. }

更多参考 shelljs。

5.5 blessed-contrib 命令行图表


更多参考 blessed-contrib。

5.6 cash 跨平台 linux 命令 的 node 封装

与 shelljs 功能差不多。


 
 
  1. const $ = require('cash');

  2. const out = $.ls('.', {l: true});

更多参考 cash。

5.7 prompts 又一个让命令行与用户进行交互的工具

与 Inquirer.js 功能差不多。

更多参考 prompts。

5.8 ora 命令行加载中图标


更多参考 ora。

5.9 progress 命令行进度条

 
 
  1. downloading [=====             ] 39/bps 29% 3.7s

更多参考 progress。

5.10 更多

更多关于命令行的工具库可以参考 command-line-utilities。

6. 比较常用的命令行 APP

命令行相关的应用就很多啦,比如 babelwebpackrollupeslint 等,但这些不仅仅是命令行工具。

下面介绍一些纯命令行应用:

  • vtop: 美美的 linux top 命令界面

  • speed-test: 测试网络链接速度

  • http-server: 零配置启动一个 http 服务器

  • fkill-cli: 跨平台 kill 命令

更多纯命令行应用可以参考 command-line-apps。


原文发布时间为:2018-10-13

本文作者:senntyou

本文来自云栖社区合作伙伴“前端大学”,了解相关信息可以关注“前端大学”。

相关文章
|
8月前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
248 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
11月前
|
JavaScript
如何使用内存快照分析工具来分析Node.js应用的内存问题?
需要注意的是,不同的内存快照分析工具可能具有不同的功能和操作方式,在使用时需要根据具体工具的说明和特点进行灵活运用。
336 62
|
9月前
|
存储 资源调度 JavaScript
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具
npm、cnpm 和 pnpm 是三种常用的 Node.js 包管理工具。npm 是官方默认的包管理器,提供依赖管理、安装和更新等功能;cnpm 是由阿里巴巴开发的 npm 镜像,专为中国大陆用户优化,解决下载速度慢的问题;pnpm 通过硬链接技术提高安装速度并节省磁盘空间,特别适合磁盘资源紧张的环境。三者命令类似,但各有特色,开发者可根据需求选择合适的工具。
901 5
|
12月前
|
存储 JavaScript 前端开发
Node.js 常用工具
10月更文挑战第6天
115 2
|
JavaScript 小程序 Java
【工具】用nvm管理nodejs版本切换,真香!
本文详细介绍了如何使用 nvm(node.js 版本管理工具)解决在不同项目间频繁切换 Node.js 版本的问题。通过实例展示了 A、B 两个项目分别依赖 v14.19.1 和 v16.15.0 版本时的解决方案,并提供了 nvm 的下载、安装及常用命令等实用信息,帮助读者轻松管理 Node.js 版本。文章还包括了卸载已安装的 Node.js、配置环境变量等步骤,确保切换顺畅无阻。
1008 1
【工具】用nvm管理nodejs版本切换,真香!
|
存储 JavaScript 前端开发
Node 版本控制工具 NVM 的安装和使用(Windows)
本文介绍了NVM(Node Version Manager)的Windows版本——NVM for Windows的安装和使用方法,包括如何安装Node.js的特定版本、列出已安装版本、切换使用不同版本的Node.js,以及其他常用命令,以实现在Windows系统上对Node.js版本的便捷管理。
Node 版本控制工具 NVM 的安装和使用(Windows)
|
JavaScript Linux 开发者
一个用于管理多个 Node.js 版本的安装和切换开源工具
【9月更文挑战第14天】nvm(Node Version Manager)是一个开源工具,用于便捷地管理多个 Node.js 版本。其特点包括:版本安装便捷,支持 LTS 和最新版本;版本切换简单,不影响开发流程;多平台支持,包括 Windows、macOS 和 Linux;社区活跃,持续更新。通过 nvm,开发者可以轻松安装、切换和管理不同项目的 Node.js 版本,提高开发效率。
353 5
|
12月前
|
Web App开发 JavaScript 前端开发
Node.js:JavaScript世界的全能工具
Node.js:JavaScript世界的全能工具
|
12月前
|
JavaScript 网络协议
Node.js 工具模块
10月更文挑战第7天
85 0
|
JavaScript IDE 前端开发
前端开发工具配置 nodejs & git & IDE
前端开发工具配置 nodejs & git & IDE