我们经常会遇到这样的需求:想要将Node模块转变成一个Linux命令行工具,包括支持命令行选项/参数。
参考文档 -> 命令行的艺术
小实例
开始编写之前需要确认的一件事情是你已经安装了Node.js。你可以在命令行中运行 which node 来确认是否已经安装,或者运行 node -v 查看 node 的版本 。如果你已经安装了node,你可以看到类似于下面的输出结果,一般情况安装了node.js 顺带npm工具自动安装了。
$ which node
/d/Program Files/nodejs/node
$ node -v
v7.9.0
创建目录
代码 :https://github.com/JXtreehous...
首先任意创建一个文件夹,初始化 package.json
文件,在该文件夹下创建bin目录:
$ mkdir command-line-tool #创建一个文件夹
$ cd command-line-tool && mkdir bin
$ npm init #初始化 `package.json` 文件
编写命令行
cd到 bin 目录下,新建一个 commander.js 文件(名字自取),编写如下代码,在js文件顶部加上 #!/usr/bin/env node 这段代码:
上面的 #!/usr/bin/env node
(或者/d/Program Files/nodejs/node
),表示用后面的路径所示的程序来执行当前文件夹。还需要一个 package.json
文件
{
"name": "command-line-tool",
"version": "0.1.0",
"description": "a commander example",
"main": "commander.js",
"bin": {"commander": "bin/commander.js"},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "AlexZ33",
"license": "MIT"
}
运行 node bin/wcommander.js
会显示当前文件夹下的所以文件和文件夹名
package.json
文件中 bin 里面的内容表示这个字段将commander
命令映射到了你的 bin/commander.js
脚本
npm-link
package.json#bin
版本号管理:此工具采用 npm版本号采用的 semver 规则
npm link
确保你在 package.json
文件中添加了 bin 节点。然后打开命令了工具进入command-line-tool
目录
"bin": {"commander": "bin/commander.js"}
启用命令行:
打开命令行,输入npm link
会自动添加全局的symbolic link
,然后就可以使用自己的命令了。
npm link
这里我们通过npm link在本地安装了这个包用于测试,然后就可以通过
$ commander
//bin
//package.json
$ commander -v
//version is 1.0.0
$ commander -h
//Useage:
// -v --version [show version]
更多npm link的信息请查看 npm官方文档
用Phantom和Commandder制作一个截屏工具
如上面的小例子,第一行我们依然
#!/usr/bin/env node
然后要提供命令行参数/选项,包括重要的--help,需要使用Commander模块:
const phantom = require('phantom')
const program = require('commander');
program
.version('0.0.1')
.option('-s, --source[website]', 'Source website')
.option('-f, --file[filename]', 'filename')
.parse(process.argv)
const run = async() => {
const instance = await phantom.create();
const page = await instance.createPage();
await page.on('onResourceRequested', function(requestData) {
console.info('Requesting', requestData.url)
});
const status = await page.open(program.source)
await instance.exit();
}
run()
上面这段
const run = async() => {
}
run()
可以直接写成自执行匿名函数
(async function(){
})();
处理命令行参数的常用模块
yargs 和 minimist 都是用来解析命令行参数的,但是有一点需要注意的是 yargs 内部的解析引擎就是 minimist。minimist 就是一个轻量级的命令行参数解析引擎。
- inquirer: 一个用户与命令行交互的工具
它们两者共同点肯定有,不同点就是 yargs 是对 minimist 进行了更进一步的封装。
有意思的包
node-getmac
/**
* @file get local mac address
* @author liulangyu(liulangyu90316@gmail.com)
*/
var execSync = require('child_process').execSync;
var platform = process.platform;
module.exports = (function () {
var cmd = {
win32: 'getmac',
darwin: 'ifconfig -a',
linux: 'ifconfig -a || ip link'
}[platform];
var regStr = '((?:[a-z0-9]{2}[:-]){5}[a-z0-9]{2})';
var macReg = new RegExp('ether\\s' + regStr + '\\s', 'i');
try {
var data = execSync(cmd).toString();
var res = {
win32: new RegExp(regStr, 'i').exec(data),
darwin: macReg.exec(data),
linux: macReg.exec(data)
}[platform];
if (res) {
return res[1];
}
}
catch (e) {
return '';
}
})();
linux 命令 nodejs实现
mkdirp
node-mkdirp是一个linux命令 mkdir -p的node版本,也就是创建多级目录。node-mkdirp值得新手学习的地方在于学习对于错误码的利用和基本的API使用。我曾经也写过一个创建多级目录的方法,不过自己都只是通过split方法对目录分隔开后逐层判断是否存在,再创建。node-mkdirp的方式则是通过fs.mkdir的错误码来判断,挺巧妙的。
ENOENT
: 这只是“没有这样的目录条目”。 由于目录条目可以是目录或文件(或符号链接,套接字,管道或设备)
参考
使用Node.js创建命令行工具
Building a simple command line tool with npm
Nodejs 制作命令行工具
Node.js 命令行程序开发教程 by 阮一峰
前端扫盲-之打造一个Node命令行工具
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。