Node.js 命令行工具的编写

一样平常开发中,编写 Node.js 下令行工具来完成一些小义务是很常见的操作。其编写也不难,和一样平常编写 Node.js 代码并无二致。package.json 中的 bin 字段一个 npm 模块,若是在 package....


一样平常开发中,编写 Node.js 下令行工具来完成一些小义务是很常见的操作。其编写也不难,和一样平常编写 Node.js 代码并无二致。


package.json 中的 bin 字段

一个 npm 模块,若是在 package.json 中指定了 bin 字段,那说明该模块提供了可在下令行执行的下令,这些下令就是在 bin 字段中指定的。

package.json

{
  "bin": {
    "myapp": "./cli.js"
  }
}

程序安装后会可在下令行执行 myapp 下令,现实执行的就是指定的这个 cli.js 文件。若是是全局安装,会将这个目的 js 文件映射到 prefix/bin 目录下,而若是是在项目中安装,则映射到 ./node_modules/.bin/ 目录下。

好比上面的示例,全局安装后会将 cli.js 映射到 /usr/local/bin/myapp 目录下。

# 查看项目中安装的所有可执行模块
$ ll node_modules/.bin
...
webpack -> ../webpack/bin/webpack.js
...

若是你的 npm 包只提供了一个可执行的下令,可直接将 bin 字段设置为目的文件,此时下令行中可执行的 CLI 下令名为 npm 包名(即 name 字段)。

{
    "name": "my-program",
    "version": "1.2.5",
    "bin": "./path/to/program"
}

以是上面的设置和下面这个设置是等效的。

{
    "name": "my-program",
    "version": "1.2.5",
    "bin": {
        "my-program": "./path/to/program"
    }
}

执行:

$ my-program 

CLI 下令的编写

为项目添加 README 文件是很常见的操作,每次都从零最先是没必要的。这时候就可以通过建立一个 README 模板,然后写一个 CLI 工具来天生到项目中。这样,将工具安装到全局或通过 npx 就可以方便地完成 README 文件的建立。

$ npx mkreadme
README.md created

初始化项目

$ npm init -y

修改 package.json 文件为如下内容:

{
  "name": "mkreadme",
  "bin": "./cli.js",
  "version": "0.1.0",
  "license": "MIT"
}


建立入口文件

$ touch cli.js

入口文件即 bin 字段所指向的文件,它可以是任何文件名,只需要在行首指定运行环境即可。Node.js 的 CLI 下令,期望的运行环境当然是 Node.js。

cli.js

 #!/usr/bin/env node
 // 其他代码...

然后添加我们的功效代码,从远端获取一个 README 模板文件到内陆。

cli.js

#!/usr/bin/env node

const fs = require("fs");
const https = require("https");

const TEMPLATE_FILE =
  "https://raw.githubusercontent.com/wayou/readme-template/master/README.md";

const file = fs.createWriteStream("README.md");
https.get(TEMPLATE_FILE, resposne => {
  resposne.pipe(file);
  console.log("README.md created");
});

这里,我们将模板文件放远端的一个位置然后通过网络请求下载下来,而不是直接放到 npm 模块中。这样做的利益是后面可以随时更新我们的模板文件而无须重新公布这个 npm 模块。


调试

通过在当前开发目录举行 link 操作可举行内陆调试。

$ npm link
 link 操作的输出信息

然后就可以在任何地方执行刚刚建立的 CLI 下令了。

$ mkreadme
README.md created

参数的获取

让下令支持参数可以实现加倍天真的功效。通过 process.argv 在代码中能够获取到来自下令行的输入。但需要注重它返回的参数列表中前两位是 Node.js 的路径和当前项目的路径,从第三个米素最先才是下令中用户输入的数据。

#!/usr/bin/env node

const fs = require("fs");
const https = require("https");

const TEMPLATE_FILE =
  "https://raw.githubusercontent.com/wayou/readme-template/master/README.md";

+ const [, , ...args] = process.argv;

const file = fs.createWriteStream("README.md");
+ const url = args[0] || TEMPLATE_FILE;
+ https.get(url, resposne => {
  resposne.pipe(file);
  console.log("README.md created");
});

通过添加参数的支持,我们可以让使用者手动指定一个模板地址以下载对应的模板文件。


公布

最后一步就是公布出去,这样所有人就能安装使用了。

$ npm publish --access public

安装与使用

$ npm i -g mkreadme
$ mkreadme
README.md created

除了像上面将下令安装到全局使用外,小我私家加倍推荐的方式是通过 npx。npx 会自动查找本机是否有安装响应模块,若是没有的话,自动去远端查找并执行。通过 npx 就不用安装到内陆,每次运行都可以使用远端最新的版本。

$ npx mkreadme
README.md created

后续的优化

示例中只实现了基本的功效,作为一个功效健全的实用工具,可以做以下的优化:

  • 天生时做重名判断,若是已经存在 README 文件则提醒是否笼罩。
  • 文件下载和建立过程中的异常处置及提醒。
  • 提供并打印辅助信息,对使用者加倍友好。
  • 对输出举行格式化,高亮输出相关信息,使信息更易读。

完整的示例

上面示例中的代码可在 mkreadme 这个堆栈中找到。同时也公布到了 npm,可直接使用体验该工具。


三方工具

下令行工具能够打印辅助和使用信息是很主要的,若是自己输出的话,会面临格式化这些内容的贫苦。
若是提供的参数许多,剖析处置用户输入的参数也是件很贫苦的事。

像参数校验,错误提醒及辅助信息的输出,这些下令行工具基本的功效已经有三方库对照成熟地解决了,好比 commander.js。通过这个库可方便地编写加倍庞大的下令行工具。

至于将输出信息举行高亮加彩色举行展示,也有响应三方库好比 chalk。


思源资源网:分类流动

1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入

3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/2875

  • 发表于 2021-02-11 16:56
  • 阅读 ( 210 )
  • 分类:互联网

0 条评论

请先 登录 后评论
colxnh
colxnh

737 篇文章

你可能感兴趣的文章

相关问题