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 ...
随机推荐
- Sword 哈希表
哈希表 哈希表是一种典型的以空间换取时间的数据结构,在没有冲突的情况下,对任意元素的插入.索引.删除的时间复杂度都是O().这样优秀的时间复杂度是通过将元素的key值以hash方法f映射到哈希表中的某 ...
- JS 生成随机字符串 随机颜色
使用Math.random()生成随机数 0.7489584611780002数字的.toString(n) 将数字转换为 n 进制的字符串 n取值范围(0~36)"0.vbpjw8lipf ...
- Superset配置mysql数据源
1.添加mysql数据源 测试连接的时候遇到 No module named 'MySQLdb'" 安装mysqlclient pip install mysqlclient 如果遇到 ER ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之点播分享
背景介绍 EasyDSS流媒体服务器软件,提供一站式的视频上传.转码.点播.直播.时移回放等服务,极大地简化了开发和集成的工作.其中,点播功能主要包含:上传.转码.分发.直播功能,主要包含:直播.录像 ...
- Python模块学习filecmp文件比较
Python模块学习filecmp文件比较 filecmp模块用于比较文件及文件夹的内容,它是一个轻量级的工具,使用非常简单.python标准库还提供了difflib模块用于比较文件的内容.关于dif ...
- Mysql操作命令(基础)
创建数据库 CREATE DATABASE name; 显示所有数据库 SHOW DATABASES; 删除数据库 DROP DATABASE name; 选择数据库 USE DATABASENAME ...
- kafka安装linux版
安装实战 kafka安装包下载(注意:这里选择的安装包是2.11系列的1.1.0版本的) wget https://archive.apache.org/dist/kafka/1.1.0/kafka_ ...
- js中常见字符串类型操作方法(2)
toLowerCase(),toLocalLowerCase(),toUpperCase(),toLocaleUpperCase() var stringValue = "hello wor ...
- leetcode动态规划笔记一---一维DP
动态规划 刷题方法 告别动态规划,连刷 40 道题,我总结了这些套路,看不懂你打我 - 知乎 北美算法面试的题目分类,按类型和规律刷题 题目分类 一维dp House Robber : 求最大最小值 ...
- Python入门 .变量 常量 基础数据类型 用户输入 流程控制语句 小练习题
# 2.name = input(“>>>”)通过代码来验证name变量是什么数据类型?--str name = input(">>>") pr ...