使用commander和inquirer创建命令行交互项目

简介: 使用commander和inquirer创建命令行交互项目

最近开始学习node.js这两天也利用学到的知识做了一个小demo:

使用命令行commander和inquirer库搭配fs文件系统做了一个命令行清单


微信图片_20230107111653.png微信图片_20230107111659.png


fs文件系统


利用fs的读操作和写操作,将创建的清单添加到数据里,要想将数据写进文件里,必须要先读数据

readFile读数据


node是异步操作的语言,同样readFile也是异步操作的方法

node内置的fs库里也配置的有同步读数据的方法readFileSync,但是对于此项目我都写的是异步操作

fs.readFile(path,[options],callback)可以写三个参数,也可以写两个参数(【】内的就是可写可不写),第一个参数就是文件的路径,

第二个参数是文件系统标志{flag:' '},控制文件的操作权限,默认是{flag:'r'}只读操作。a+是拥有读写的权限flag的参数意思

第三个参数是回调函数,当读取失误时就会传入error参数,成功时会传入data,data就是文件读取的内容,但是是二进制的,还需要使用toString()转化为字符串

read(path = dbPath){
    return new Promise((resolve,reject)=>{
        fs.readFile(path,{flag:'a+'},(error,data)=>{
            if(error){return reject(error)}
            let list
            try{
                list = JSON.parse(data.toString())
            } catch(error){
                list = []
            }
            resolve(list)
        })
    })
},

readFile是异步操作,read读方法读文件数据时使用promise

调用此方法的语句加上awitasync

module.exports.add= async (title)=>{
    //读之前的任务 ,因为读取是异步操作所以使用await和async
    const list = await db.read();
}

writeFile写数据


writeFile()要有三个参数,第一个是路径,第二个是要写入的数据(字符串格式),第三个是回调函数

return new Promise((resolve,reject)=>{
    const string = JSON.stringify(list)
    fs.writeFile(path,string,(error)=>{
      if(error){ return reject(error) }
      resolve()
    })
  })

commander.js库


commander.js是node.js命令行的解决方案


安装


首先进行安装

yarn add commander

commander.js的github官方文档

使用

//这两句是引入commander库
const { Command } = require('commander');
const program = new Command();
//这个是自己写的api(读写操作)
const api = require('./index.js')
program
    .option('-x, --xxx', 'what the xxx')
program
//添加指令 add,<taskName>是指令的参数
    .command('add <taskName>')
    .description('add a task')//指令的描述
    .action((title) => {
        //action是操作指令后会干什么
        api.add(title).then(()=>{console.log('添加成功')},()=>{console.log('添加失败')} )
    });
program
    .command('clear')
    .description('clear all task')
    .action(() => {
        api.clear().then(()=>{console.log('清除成功')},()=>{console.log('清除失败')} )
    });
program.parse(process.argv);

options


一个program.option('-x, --xxx', 'what the xxx')就是一个选项文档

使用命令时,node是执行node操作,cli是我的入口文件名,-x就是自己设置的选项


微信图片_20230107112037.png


指令


一个完整的program就是一个指令

program
//添加指令 add,<taskName>是指令的参数
    .command('add <taskName>')
    .description('add a task')//指令的描述
    .action((title) => {
        //action是操作指令后会干什么
        api.add(title).then(()=>{console.log('添加成功')},()=>{console.log('添加失败')} )
    });

add就是指令名,<taskName>就是参数名

action就是当你执行这个指令后要干什么


inquirer命令行交互工具


inquirer是命令行交互工具,用户控制选项操作


微信图片_20230107112200.png


安装

yarn add inquirer

inquirer的github官方文档


使用


inquirer
  .prompt([
    {
      type:'list',
      name:'index',
      message: '请选择你想要操作的任务?',
     choices: [
         {name:'退出',value:'quit'},
         {name:'已完成',value:'markAsDone'},
        {name:'未完成',value:'markAsUndone'},
        {name:'改标题',value:'updateTitle'},
        {name:'删除',value:'remove'}
     ]
    },
  ])
  .then((answer) => {
      //选中后会执行then操作,answer是选中的项目
  });

发送到npm


在cli入口文件上添加#!/usr/local/bin/node


#!/usr/local/bin/node

让编译器用node执行js代码


修改package配置


{
    //名字必须是小写
  "name": "node-todolist",
  //用t代替cli.js执行命令
  "bin": {
    "t": "cli.js"
  },
  //上传的npm的文件,(所有以js结尾的文件)
  "files": [
    "*.js"
  ],
  "version": "0.0.1",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "commander": "^6.2.1",
    "inquirer": "^7.3.3"
  }
}

在终端执行这一句话,赋予它可执行权限

chmod +x cli.js

在终端登录npm账户


发送之前要把淘宝源修改为npm的官方源 使用 nrm ls 查看源


微信图片_20230107112432.png


此时我使用的是淘宝源,切换到npm的官方源

nrm use npm

登录你的npm账户

npm adduser

微信图片_20230107112514.png


上传

npm publish
目录
相关文章
|
6月前
|
测试技术
如何用命令行执行cypress?
如何用命令行执行cypress?
112 0
|
4月前
|
Python
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
`cmd`模块是Python标准库中的一个模块,它提供了一个简单的框架来创建命令行解释器。
|
6月前
|
JavaScript 前端开发 数据安全/隐私保护
NodeJS 下构建 命令行工具(CLI) 与 交互式命令界面 的实践
NodeJS 下构建 命令行工具(CLI) 与 交互式命令界面 的实践
419 1
|
6月前
|
Kubernetes 监控 Shell
K8S 实用工具之二 - 终端 UI K9S
K8S 实用工具之二 - 终端 UI K9S
UE中创建可脚本化编辑器工具(Scriptable Tools)
UE中创建可脚本化编辑器工具(Scriptable Tools)
233 0
UE中创建可脚本化编辑器工具(Scriptable Tools)
|
JavaScript 前端开发 数据安全/隐私保护
NodeJS 下构建 命令行工具 与 交互式命令界面 的实践
NodeJS 下构建命令行工具 与 交互式命令界面 的实践
552 0
NodeJS 下构建 命令行工具 与 交互式命令界面 的实践
|
SQL 分布式计算 运维
使用Grunt shell方式交互处理数据
使用Grunt shell方式交互处理数据
|
Web App开发 JavaScript 前端开发
在vscode中调试CocosCreator插件主进程
在vscode中调试CocosCreator插件主进程
1110 0
|
前端开发 JavaScript API
命令行终端是怎么做的?教你写一个命令行终端[electron实战]
前言 Electron很出名,很多人可能了解过,知道它是用来开发桌面端的应用,但是一直没有在项目中实践过,缺乏练手的实践项目。 很多开源的命令行终端都是使用Electron来开发的,本文将从零开始手把手的教大家用Electron写一个命令行终端。 作为一个完整的实战项目示例,该终端demo也将集成到Electron开源学习项目electron-playground中,目前这个项目拥有800+ Star⭐️,它最大的特点是所见即所得的演示Electron的各种特性,帮助大家快速学习、上手Electron。 大家跟着本文一起来试试Electron吧~ 下载试玩 本文命令行终端demo的代码量很少,
700 0
命令行终端是怎么做的?教你写一个命令行终端[electron实战]
使用 VSCode 调试 Electron 主进程代码
在开发 Electron 应用的时候,为了提高工作效率,我们需要借助于调试工具,及时发现并解决问题。
286 0
使用 VSCode 调试 Electron 主进程代码