◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
一样平常开发中,编写 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 然后就可以在任何地方执行刚刚建立的 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 后续的优化示例中只实现了基本的功效,作为一个功效健全的实用工具,可以做以下的优化:
完整的示例上面示例中的代码可在 mkreadme 这个堆栈中找到。同时也公布到了 npm,可直接使用体验该工具。 三方工具下令行工具能够打印辅助和使用信息是很主要的,若是自己输出的话,会面临格式化这些内容的贫苦。 像参数校验,错误提醒及辅助信息的输出,这些下令行工具基本的功效已经有三方库对照成熟地解决了,好比 commander.js。通过这个库可方便地编写加倍庞大的下令行工具。 至于将输出信息举行高亮加彩色举行展示,也有响应三方库好比 chalk。 |
1.阿里云: 本站现在使用的是阿里云主机,平安/可靠/稳固。点击领取2000米代金券、领会最新阿里云产物的种种优惠流动点击进入
2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各种产物的最新流动,优惠券领取点击进入
3.广告同盟: 整理了现在主流的广告同盟平台,若是你有流量,可以作为参考选择适合你的平台点击进入
链接: http://www.fly63.com/article/detial/2875
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。