开发命令行工具常用的十个包

708 阅读5分钟

前言

开发中,我们经常会遇到一些可自动化的场景,这时候就需要产出一个工具去实现自动化任务。这种自动化场景,通常可以通过命令行的形式去解决。本篇文章就介绍些开发命令行工具,必备的十个 NPM 包。

工具包

commander

完整的 node.js 命令行解决方案。

commander将一个命令的多个组成部分进行抽象与规范,让开发一个命令行工具定义配置与获取用户入参配置非常容易。关于获取配置数据其本质上是对 process.argv 的解析。

命令行参数由选项(options)、选项参数(option-arguments)、命令(commands),以及命令参数(command-arguments)组成。

术语解释
选项(option)-后跟单个字母,或--后跟单词(或以-连接的多个单词),例如-s及--short
选项参数(option-argument)有的选项可以接受一个参数
命令(command)一个程序或命令可以包含子命令
命令参数(command-argument)传给命令的参数(不包含选项或选项参数)

例如:

my-utility command --option option-argument command-argument-1 command-argument-2

fs-extra

fs-extra添加了原生fs模块中不包含的文件系统方法,并为fs方法添加了promise支持。

fs-extra 替代 fs 吧,它有这些特性:

  • 所有 fs 上的方法都挂载到了 fs-extra 上,完全可替代 fs;
  • Sync vs Async vs Async/Await vs Promise 对于 fs-extra 都能很好的支持;
  • 相比 fs 增加了很多实用的工具函数,例如:
    • 无视文件或目录的增删查改,把文件与目录区分度降低
    • 多级目录创建,fs api 比较原子,创建多级目录需要多次操作,而 fs-extra 内部已经帮我们做了,不需考虑过多,api 实现非常符合直觉
    • 文件或目录的移动、拷贝
    • JSON 文件读取与写入,注意这里与直接 require 的区别,require 会直接加载到内存里,再次调用直接走内存了;而这里本质上是对文件的读取,每次都重新读取文件信息。

cross-spawn

A cross platform solution to node's spawn and spawnSync.

我们常常需要在执行 node 主进程时,开启子进程处理一些其他任务,例如我们想要往当前仓库自动按照一个包:yarn add xxx

那为什么需要它?node 自带的基础 child_process 模块不满足么?

主要是 node spwan 在 Windows 系统上有一些问题:

  • 执行命令时,忽略路径后缀,例如批处理文件 .bat;
  • 执行命令时参数带空格,eg: spawn('nospaces.cmd', ['arg with spaces']);
  • 执行命令使用相对路径,eg: ./my-folder/my-executable
  • 执行命令时当参数包含引号和圆括号,且命令来自于node_modules/.bin/ 时,会引发 syntax error
  • node <v4.8 时,options.shell 不支持

所有以上问题,corss-spawn 都可以正常处理。

glob

This is a glob implementation in JavaScript. It uses the minimatch library to do its matching.

glob 算是一种 DSL(Domain Specific Language - 领域特定语言) 了。常用于操作系统文件路径匹配,我们常见的有这些:

  • shell 命令文件匹配,例如 ls *.js
  • .gitignore 文件,git 版本控制忽略文件,例如 build/*
  • .eslintignore 等

glob 包是在 js 中的实现,它可以用于自动化工具,批量查找我们需要的文件,会非常有用。

uuid

For the creation of RFC4122 UUIDs

RFC4122 规范实现,用于在 js 中创建唯一标识,例如你想要上传文件到 oss 生成唯一标识,或其他场景,会比较有用。它有这些特性:

  • 完全支持 RFC4122 version 1, 3, 4, and 5
  • 跨平台:web/node/rn
  • 安全:加密非常强的随机数
  • 小:0依赖、tree shaking 友好
  • 支持 CLI 使用

git-rev-sync

用于同步获取 git repo 当前的 commit hash, tag, count, branch or commit message。使用场景:

  • 自动化部署我们通常会记录下当前代码 commit hash,便于查看历史部署代码与代码回滚操作;
  • 方便其他系统与 git 打通;
  • 相比于 spwan 调用命令,使用上会比较简单;

其实现本质上是调用的 git 基础命令。

form-data

当有需要再 node 端上传文件时,手动构造 form-data,会比较麻烦,会涉及到 Boundary 的组装,这时 form-data就比较有用了。你可以像在 web 端一样构建,使用简单。

你可以直接通过 form-data 自带方法进行 http 调用:

const FormData = require('form-data');

const form = new FormData();

form.append('my_field', 'my value');
form.append('my_buffer', new Buffer(10));

form.submit('http://example.org/', function(err, res) {
  // res – response object (http.IncomingMessage)  //
  res.resume();
});

或与其他 http client 结合使用:

const form = new FormData();

form.append('file', file);
axios.post(url, form, { headers: form.getHeaders() });

semver

npm 语义化版本实现,可以用来校验版本是否合法、比较版本变化、版本匹配度,版本适配范围等。

当我们需要自动化管理版本号,升级版本时,会比较有用,常用方法:

const semver = require('semver')

semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
semver.clean('  =v1.2.3   ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
semver.minVersion('>=1.0.0') // '1.0.0'
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'

inquirer

A collection of common interactive command line user interfaces.

常用的交互式命令行用户界面。当需要让用户输入一些信息时,这很有用处。使用示例:

log4js

开箱即用的日志管理工具,它拥有这些特性:

  • 带颜色的控制台记录stdout或stderr;
  • 文件追加器,可根据文件大小或日期配置日志滚动记录(这对于 http server 比较有用,能做一些标准化的日志切割);
  • 可便捷集成 connect/express 等框架;
  • 可配置日志消息布局/模式;
  • 区分日志等级(DEBUG、ERROR、INFO等)。
var log4js = require("log4js");
var logger = log4js.getLogger();
logger.level = "debug";
logger.debug("Some debug messages");

默认输出格式:

[2010-01-17 11:43:37.987] [DEBUG] [default] - Some debug messages

总结

以上就是对常用工具包的简要介绍,希望对大家有所帮助。

完。