前言
开发中,我们经常会遇到一些可自动化的场景,这时候就需要产出一个工具去实现自动化任务。这种自动化场景,通常可以通过命令行的形式去解决。本篇文章就介绍些开发命令行工具,必备的十个 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
总结
以上就是对常用工具包的简要介绍,希望对大家有所帮助。
完。