这是本文档旧的修订版!


命令行

建立程序

首先初始化一個項目1) npm init,在 package.json 中設定工具名稱

{
  "name": "golden",
  "version": "1.0.0",
  "description": "數據管理以及金融分析工具",
  "main": "index.js",
  "author": "鎏金天涯",
  "license": "MIT"
}

在本目錄下全局安裝 npm install -g 後即可使用 golden xxx 命令。

交互式命令行

首先安装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

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默认后缀。
it/node/命令行.1638169993.txt.gz · 最后更改: 2021-11-29 07:13 由 goldentianya
回到顶部
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0