搜索
搜索
天涯的知库
显示页面
过去修订
您的足迹:
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== 命令行 ====== ===== 建立程序 ===== 准备:在服务器上安装 node.js 以及 npm <code shell> sudo apt install nodejs sudo apt install npm </code> 首先初始化一個項目((a>[[https://segmentfault.com/a/1190000039110450|Node.js-CLI开发工具]])) <color #ff7f27>''%%npm init%%''</color>,在 package.json 中設定工具名稱 <code json> { "name": "golden", "version": "1.0.0", "description": "數據管理以及金融分析工具", "main": "index.js", "author": "鎏金天涯", "license": "MIT" } </code> 在本目錄下全局安裝 <color #ff7f27>''%%npm install -g%%''</color> 後即可使用 <color #ff7f27>''%%golden xxx%%''</color> 命令。 (因为在package.json中已经定义了bin的执行路径) ===== 交互式命令行 ===== 首先安装commander.js:<color #ff7f27>''%%npm install commander%%''</color> 在 index.js 主文件中編輯個性化的命令,例: <code javascript> 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() }) </code> * 具體使用方式請參照 api 工程以及 ((a)) 文章。 ====== readline ====== [[https://nodejs.org/api/readline.html|readline 官方文檔]] 為了不讓console的輸出結果太長,需要清除臨時顯示的行,借助 readline.js 庫文件((b>[[https://www.w3schools.com/nodejs/ref_readline.asp|readline 3w]])) <color #ff7f27>''%%npm install readline%%''</color> <code javascript> 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); } </code> 常用命令 * clearLine() * cursorTo() * moveCursor() * clearScreenDown() * createInterface() * emitKeypressEvents() **接受用户输入** <code javascript> 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()) }); }) </code> 调用 <color #7092be>inquirer</color> 之后 readline 的上下箭头不显示历史记录,变成 <color #ff7f27>''%%⌃[[A%%''</color> 这样的乱码字符串,修正这个错误需要调用 <color #ff7f27>''%%process.stdin.setRawMode( true ); %%''</color> 函数。 ====== 交互工具 ====== 需要借助 inquire.js ((c>[[https://blog.csdn.net/qq_26733915/article/details/80461257|inquirer.js —— 一个用户与命令行交互的工具]])) ((d>[[https://www.npmjs.com/package\//inquirer|Inquirer.js <em>''\//'']]))庫來實現命令交互。 安裝工具 <color #ff7f27>''%%npm install inquirer%%''</color> 後在js/ts文件中使用: <code javascript> 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 === '测试环境' </code> 其它類型: <code javascript> type: "confirm", default: true </code> ===== 參數 ===== 由于交互的问题种类不同,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/命令行.txt
· 最后更改: 2023-08-07 16:19 由
goldentianya
回到顶部