Node: 开发命令行程序英文版 (Create Your Own CLI)
CLI, as an abbreviation of Command-line Interface, can receive user's input and give an immediate response in terminal.
In Node.js, globally installed packages have this kind of command line interface, taking 'http-server' as a brief example here:

What if we wanna make one like that? Easy, create files below first:

After that, we will create a my-cli.js file in 'bin' folder:
#!/usr/bin/env node
console.log('hello my-cli');
Note that: The first line indicates it's an executable file in Node.js environment, and that's indispensable。
Also package.json config is a necessary step:
{
"author": "Scott",
"license": "MIT",
"name": "my-cli",
"version": "1.0.0",
"description": "my-cli",
"bin": {
"my-cli": "bin/my-cli.js"
},
"preferGlobal": "true"
}
As above, we provide a 'bin' configuration which has global command 'my-cli' pointing to 'bin/my-cli.js', and the last property 'preferGlobal' states clearly it supports global installation.
Now we open a terminal and run the following command in 'my-cli' dev folder:

As picture shows, we can run 'my-cli' command globally after installing our package via 'npm install -g .', magic happens!
Now we already complete a simple CLI program, but is it short of something? Em..., maybe we can add interactions for command line, and also, make it support two usage: global execution and normal import.
After a slight improvement on file structure:

As we see, a 'lib' folder was created for some logic files, a demo code shows below:
let chalk = require('chalk');
let sayHello = name => {
// special fonts by 'chalk' lib
return chalk.bold('Hello, ') + chalk.bold.bgRed(name);
};
exports.sayHello = sayHello;
We defined a 'sayHello' function and return a greeting word by passing the name, we also use the 'chalk' lib for special fonts in terminal.
Now let's have a glance at 'bin/my-cli.js':
#!/usr/bin/env node
let readline = require('readline');
let lib = require('../lib/index.js');
// interaction
let interface = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// question and answer
interface.question('What is your name? ', answer => {
let greeting = lib.sayHello(answer);
console.log(greeting);
interface.close();
});
'readline' module is an encapsulation on stdin and stdout, used to prompt and receive user's input.
And last, some modifications should be done in package.json:
{
"author": "Scott",
"license": "MIT",
"name": "my-cli",
"version": "1.0.0",
"description": "my-cli",
"bin": {
"my-cli": "bin/my-cli.js"
},
"main": "lib/index.js",
"preferGlobal": "true",
"dependencies": {
"chalk": "^1.1.3"
}
}
In addition to add 'bin' config, we also have the 'main' property, it's for the import in other lib, we will introduce it later.
Now we run 'npm install -g .' again to install globally, and open a new terminal:

As the image shows, our program received command arguments and printed the right result.
We mentioned above, our program can be a common package imported in other libs, now we create a test folder to show the demo:

This directory is simple, only includes a test.js and node_modules folder, and in node_modules it consists of my-cli folder:

Now we just take a look at the test.js:
let cli = require('my-cli');
let greeting = cli.sayHello('Jack');
console.log(greeting);
And then we run this file in terminal, and result as below:

At last, we can publish this package to npm repository, for this step, you may refer to the official docs.
Reference:
https://bretkikehara.wordpress.com/2013/05/02/nodejs-creating-your-first-global-module
https://nodejs.org/api/readline.html
Node: 开发命令行程序英文版 (Create Your Own CLI)的更多相关文章
- Node: 开发命令行程序
CLI 的全称是 Command-line Interface (命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在 Node.js 中,全局安装的包一般都具有命令行界面的功能,例 ...
- Node.js 命令行程序开发教程
nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...
- Node.js 命令行程序开发资料
Node.js 命令行程序开发教程http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html用Node.js创建命令行工具ht ...
- Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html
五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...
- 2019-11-29-dotnet-使用-System.CommandLine-写命令行程序
title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-11-29 08:33 ...
- 2019-8-31-dotnet-使用-System.CommandLine-写命令行程序
title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-08-31 16:55 ...
- dotnet 使用 System.CommandLine 写命令行程序
在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑.现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数 我写过一篇关于命令行解析的博客C ...
- 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具
原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...
- 如何用Node编写命令行工具
0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...
随机推荐
- CKA认证考试题
1.列出环境中所有的pv,并以name字段排序(使用kubectl自带排序功能) kubectl get pv --sort-by=.metadata.name 2.列出制定pod的日志中状态为err ...
- JAVA中生成指定位数随机数的方法总结
JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...
- ubuntu修改apache端口号
第一步 sudo vi /etc/apache2/ports.conf 修改监听端口以及主机端口为8080 NameVirtualHost *:8080 Listen 8080 第二步 sudo vi ...
- JavaScript 有用的代码片段和 trick
浮点数取整 const x = 123.4545; x >> 0; // 123 ~~x; // 123 x | 0; // 123 Math.floor(x); // 123 注意:前三 ...
- 【Spring Boot学习之十一】整合mongoDB
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 参考: SpringBoot+Mongodb的使用
- 记事本 该文件含有unicode格式的字符 点确定就变乱码了,notePad++,UltraEditor等编辑器打开也变乱码?
--问题 之前一直都是好的 今天电脑打开,发现电脑所有的TXT记事本,点开来全是乱码,甚至下过来的TXT,或者自己新建的TXT,打上中文字,点保存会弹出 该文件含有unicode格式的字符什么什么的, ...
- [转帖][区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得
[区块链]共识算法(POW,POS,DPOS,PBFT)介绍和心得 置顶 2017-03-12 18:31:19 乐扣老师lekkoliu 阅读数 127953 收藏 更多 分类专栏: 技术管理 区 ...
- java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- C++分治策略实现快速排序
问题描述: 给定一个未知顺序的n个元素组成的数组,现要利用快速排序算法对这n个元素进行非递减排序. 细节须知: (1)代码实现了利用递归对数组进行快速排序,其中limit为从已有的随机数文件中输入的所 ...
- svn-疑难解决
Linux下搭建SVN服务器 https://blog.51cto.com/19940919/2095011 [SVN]出现SVN--Authorization failed错误原因 https:// ...