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)的更多相关文章

  1. Node: 开发命令行程序

    CLI 的全称是 Command-line Interface (命令行界面),即在命令行接受用户的键盘输入并作出响应和执行的程序. 在 Node.js 中,全局安装的包一般都具有命令行界面的功能,例 ...

  2. Node.js 命令行程序开发教程

    nodejs开发命令行程序非常方便,具体操作方式查看下面几篇文章 http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html ...

  3. Node.js 命令行程序开发资料

    Node.js 命令行程序开发教程http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html用Node.js创建命令行工具ht ...

  4. Node.js 命令行程序开发教程 ---------http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

    五.yargs 模块 shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数.它也需要安装. $ npm install --save yargs yarg ...

  5. 2019-11-29-dotnet-使用-System.CommandLine-写命令行程序

    title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-11-29 08:33 ...

  6. 2019-8-31-dotnet-使用-System.CommandLine-写命令行程序

    title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-08-31 16:55 ...

  7. dotnet 使用 System.CommandLine 写命令行程序

    在写命令行程序的时候,会遇到命令行解析的问题,以及参数的使用和规范化等坑.现在社区开源了命令行项目,可以帮助小伙伴快速开发命令行程序,支持自动的命令行解析和规范的参数 我写过一篇关于命令行解析的博客C ...

  8. 如何用node编写命令行工具,附上一个ginit示例,并推荐好用的命令行工具

    原文 手把手教你写一个 Node.js CLI 强大的 Node.js 除了能写传统的 Web 应用,其实还有更广泛的用途.微服务.REST API.各种工具……甚至还能开发物联网和桌面应用.Java ...

  9. 如何用Node编写命令行工具

    0. 命令行工具 当全局安装模块之后,我们可以在控制台下执行指定的命令来运行操作,如果npm一样.我把这样的模块称之为命令行工具模块(如理解有偏颇,欢迎指正) 1.用Node编写命令行工具 在Node ...

随机推荐

  1. 【转载】 tf.ConfigProto和tf.GPUOptions用法总结

    原文地址: https://blog.csdn.net/C_chuxin/article/details/84990176 -------------------------------------- ...

  2. linux安装nvm和nodejs

    下载nvm包: [root@centos ~]# wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install ...

  3. 简单易用的录屏软件(保存为gif文件)

    LICEcap https://licecap.en.softonic.com/ Create animated GIFs from your desktop LICEcap is an origin ...

  4. winform调用webservice假死怎么解决

    主线程调用外部web service,没有返回时,主线程阻塞了,界面肯定假死耗时操作都是要在工作线程里面执行的.一般情况下winform调用webservice时步骤1添加服务引用---高级----添 ...

  5. 【设计】Facebook的语调设计-做的珍惜

    http://www.woshipm.com/pd/3206743.html 做的是真细呦

  6. centos7 中查看log_bin是否开启以及开启log_bin

    1.查看是否开启的命名: 在mysql客户端执行:show variables like 'log_bin';      ON:代表开启  OFF:代表未开启 2. 开启log_bin 在配置文件vi ...

  7. EF的 NoTracking 的一些记录

    NoTracking官方解释 跟踪与非跟踪查询 跟踪行为可控制 Entity Framework Core 是否将有关实体实例的信息保留在其更改跟踪器中. 如果已跟踪某个实体,则该实体中检测到的任何更 ...

  8. nginx deny 封IP

    官方文档地址:http://nginx.org/en/docs/http/ngx_http_access_module.html#deny Syntax: deny address | CIDR | ...

  9. PHP Imagick文字加阴影(外发光)

    PHP Imagick文字加阴影(外发光)<pre>$canvas = new \Imagick(); $canvas->newImage(500, 200, 'white'); $ ...

  10. Linux用户查询、新增&删除

    1.查询用户tail -1 /etc/passwd 2.新增用户&用户组groupadd testgroup #组的添加useradd testuser #创建用户testuserpasswd ...