命令行
建立程序
准备:在服务器上安装 node.js 以及 npm
sudo apt install nodejs sudo apt install npm
首先初始化一個項目1) npm init,在 package.json 中設定工具名稱
{
"name": "golden",
"version": "1.0.0",
"description": "數據管理以及金融分析工具",
"main": "index.js",
"author": "鎏金天涯",
"license": "MIT"
}
在本目錄下全局安裝 npm install -g 後即可使用 golden xxx 命令。 (因为在package.json中已经定义了bin的执行路径)
交互式命令行
首先安装commander.js:npm install commander
在 index.js 主文件中編輯個性化的命令,例:
const { program } = require('commander');
program.version(require('./package').version, '-v, --version', 'cli的最新版本');
program
.command('scan')
.option('-d, --day <day>', '指定日期,缺省则为上一个交易日。')
.description('拉取全市场的股票价格,周期性任务')
.action(async (options) => {
let date = new Date(options.day)
await db.InitConnection(0)
await dm.UpdateMarketOfDate(isNaN(date.getTime()) ? 'last' : date, doconfirm)
db.CloseConnection()
})
* 具體使用方式請參照 api 工程以及 1) 文章。
readline
為了不讓console的輸出結果太長,需要清除臨時顯示的行,借助 readline.js 庫文件2) npm install readline
var readline = require('readline');
function ShowInfo(msg:string){
// process.stdout.clearLine(); // clear current text
// process.stdout.cursorTo(0);
readline.cursorTo(process.stdout, 0);
process.stdout.write(msg);
}
常用命令
- clearLine()
- cursorTo()
- moveCursor()
- clearScreenDown()
- createInterface()
- emitKeypressEvents()
接受用户输入
this.RL = readline.createInterface({input: process.stdin, output: process.stdout, terminal: true})
// 监听 line 事件
this.RL.on('line', (line:string) => {
this.observer.next(line)
this.counter++
this.RL.pause()
})
// 外部等待输入
this.RL.setPrompt(prompt);
this.RL.prompt();
return new Promise((resolve, reject) => {
this.observer.subscribe((value:any) => {
resolve(value.trim())
});
})
调用 inquirer 之后 readline 的上下箭头不显示历史记录,变成 ⌃[[A 这样的乱码字符串,修正这个错误需要调用 process.stdin.setRawMode( true ); 函数。
交互工具
需要借助 inquire.js 3) 4)庫來實現命令交互。
安裝工具 npm install inquirer 後在js/ts文件中使用:
const inquirer = require('inquirer');
const promptList = [
// 具體交互內容
type: "list",
message: "使用测试/生产环境?",
name: "confirmTest",
choices: ['测试环境', '生产环境'],
default: this.IsTest ? '测试环境' : '生产环境'
]
inquirer.prompt(promptList).then(answers => {
// console.log(answers) // 返回的結果
})
var answers = await inquirer.prompt(promptList)
this.IsTest = answers.confirmTest === '测试环境'
其它類型:
type: "confirm", default: true
參數
由于交互的问题种类不同,inquirer为每个问题提供很多参数:
- type:表示提问的类型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor;
- name: 存储当前问题回答的变量;
- message:问题的描述;
- default:默认值;
- choices:列表选项,在某些type下可用,并且包含一个分隔符(separator);
- validate:对用户的回答进行校验;
- filter:对用户的回答进行过滤处理,返回处理后的值;
- transformer:对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;
- when:根据前面问题的回答,判断当前问题是否需要被回答;
- pageSize:修改某些type类型下的渲染行数;
- prefix:修改message默认前缀;
- suffix:修改message默认后缀。
