====== 命令行 ======
===== 建立程序 =====
准备:在服务器上安装 node.js 以及 npm
sudo apt install nodejs
sudo apt install npm
首先初始化一個項目((a>[[https://segmentfault.com/a/1190000039110450|Node.js-CLI开发工具]])) ''%%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 ', '指定日期,缺省则为上一个交易日。')
.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 工程以及 ((a)) 文章。
====== readline ======
[[https://nodejs.org/api/readline.html|readline 官方文檔]]
為了不讓console的輸出結果太長,需要清除臨時顯示的行,借助 readline.js 庫文件((b>[[https://www.w3schools.com/nodejs/ref_readline.asp|readline 3w]])) ''%%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 ((c>[[https://blog.csdn.net/qq_26733915/article/details/80461257|inquirer.js —— 一个用户与命令行交互的工具]])) ((d>[[https://www.npmjs.com/package\//inquirer|Inquirer.js ''\//'']]))庫來實現命令交互。
安裝工具 ''%%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默认后缀。