如何使用node.js编写Cli命令行

如何使用node.js编写Cli命令行

作为前端在日常开发中、经常会使用各式各样的cli工具,例如vue-cligulp-cliangular-cli等。其实就是在cmd命令行。了解这些
命令行是如何生成、编写是很有必要的。

第一步:运行编写的js代码

基于NodeJS编写的Cli其实就是Node脚本。相信所有的前端开发都能够编写:
新建my-cli 文件夹存放项目。
新建index.js 文件编写测试代码。

// test-cli/index.js
console.log('hello world')

命令行调用

PS C:\my-cli> node index.js
## 输出
hello world

可以继续优化运行方式,在my-cli下创建package.json 新增

{
 "scripts":{
  "start":"node index.js"
 }
}

然后命令行调用

PS C:\Users\Getech-200107-1\Desktop\my-cli> npm run start
> start        
> node index.js
## 输出
hello world

这种npm run xxx的命令相信大家都不陌生。
那么可以自定义运行的命令吗?毕竟人家的cli都没有这个

第二步:自定义名字

有没有什么方式可以去掉命令行中的nodenpm呢。答案当然是有咯

  • 首先我们在脚本文件(index.js)顶部添加声明
#!/usr/bin/env node
console.log('hello world')

添加 #!/usr/bin/env node 或者 #!/usr/bin/node ,这是告诉系统,下面这个脚本,使用nodejs来执行。#!/usr/bin/env node 的意思是让系统自己去找node的执行程序。#!/usr/bin/node 的意思是,明确告诉系统,node的执行程序在路径为 /usr/bin/node

  • 然后在index.js 所在目录下执行npm init。创建出一个新的package.json并新增bin字段
{
  "name": "my-cli",
  "version": "1.0.0",
  "bin":{
   "ismy-cli":"index.js"
  }
}
  • 最后执行npm link,命令行输入自定义的名字
PS C:\Users\Getech-200107-1\Desktop\my-cli> ismy-cli
## 输出
hello world

最简单的cli就完成啦!
有的人,又会说。别人的cli里面又有输入,又有选择的。有交互的。
别急慢慢来。

第三步:询问

cli中最常见的就是通过用户选择或者输入,cli做不同的策略处理。

#!/usr/bin/env node
const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
 });
rl.question('你来自哪里? ',answer=>{
  console.log(answer)
  process.exit(0)
});

执行

PS C:my-cli> ismy-cli
你来自哪里? 湖北
## 输出
湖北

第四步:获取参数

大多数的时候我们的cli不可能只创建一中类型的模板,这个时候我们一般通过 ismy-cli templeate1ismy-cli templeate2来创建不同的模板内容。

命令行上的参数,可以通过 process 这个变量获取, process 是一个全局对象。通过 process 这个对象我们可以拿到当前脚本执行环境等一系列信息,其中就包括命令行的输入情况,这个信息,保存在 process.argv

#!/usr/bin/env node
console.log(`hello ${process.argv[2]||'world'}`)

执行

PS C:my-cli> ismy-cli big
## 输出
hello bigworld
PS C:my-cli> ismy-cli small
## 输出
hello smallworld

第5步:子进程

如何你希望,clone一个git仓库的代码,并推到一个新的仓库地址,则需要使用模块子进程

const { exec } = require('child_process');
 
exec(`git init && git add . && git commit -m init`, (err, stdout, stderr) => {
  if(err) reject(err)
  else resolve()
})

以上的这些点,可以构建成一个简单的cli工具。

posted @ 2022-02-22 17:06  skylei  阅读(384)  评论(0)    收藏  举报