使用node构建简单的cli工具

news/2024/7/6 6:41:10

代码

1、在package.json中增加
{
  "name": "test",
  "version": "1.0.0",
  "bin": {
      "kkb": "./bin/kkb.js"
   },
   ...
}
2、终端中执行
kkb init mytest
3、具体的代码

kkb.js

#!/usr/bin/env node
// 指定解释器

// node.js命令行界面的完整解决方案
const program = require("commander")

// 指定版本号
program.version(require("../package.json").version)

// 增加初始化命令
program.command("init <name>").description('init project').action(require("../lib/init"))

program.parse(process.argv)

init.js

// Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法
const {promisify} = require("util")
// 「FIGlet」是基于ASCII字符组成的字符画
const figlet = promisify(require("figlet"))
const clear = require("clear")
//node终端样式库
const chalk = require("chalk")
const log = content => console.log(chalk.green(content))
const clone = require("./download") 
const open = require("open")
const spawn = async (...args) => {
    // child_process 模块提供了衍生子进程(以一种与 popen(3) 类似但不相同的方式)的能力
    const {spawn} = require("child_process")
    return new Promise(resolve => {
        const proc = spawn(...args)
        proc.stdout.pipe(process.stdout)
        proc.stderr.pipe(process.stderr)
        proc.on("close", () => {
            resolve();
        })
    })
}
module.exports = async name => {
    // 打印欢迎页
    clear()
    const data = await figlet('kkb welcome')
    log(data)

    // 下载项目
    log(`🚀创建项目: ${name}`)
    await clone ("github:su37josephxia/vue-sample", name)

    // 自动安装依赖
    log(`🚀安装依赖`)
    await spawn("cnpm", [install], {cwd: `./${name}`})
    log(`🚀安装完成`)

    // 打开浏览器
    open(`http://localhost:8080`)
    //自动启动
    await spawn("npm", ["run", "serve"], {cwd: `./${name}`})

}

download.js

const {promisify} = require("util")
module.exports = async function (repo, desc) {
    // 从git下载文件
    const download = promisify(require('download-git-repo'))
    // 下载进度条
    const ora = require("ora")
    const progress = ora(`下载...${repo}`)
    process.start()
    await download(repo, desc)
    process.succeed()

}

库讲解

1、FIGlet是基于ASCII字符组成的字符画。

FIGlet

2、child_process的使用

child_process


http://www.niftyadmin.cn/n/2815728.html

相关文章

Sourceinsight4.0关联svn自定义控件设置

Source Insight快速查看svn log diff 创建快捷键配置的步骤&#xff1a; 1.打开sourceinsight&#xff0c;关闭所有工程&#xff0c;打开Base工程 2.我们需要创建一个以.em结尾的文件放到Base工程的目录下&#xff0c;并添加进Base工程里 3.将下面附件代码内容复制到该以.em…

FLASH、eMMC、SATA、SSD、ROM、RAM、Cache概念对比解析

Flash(快闪存储器) 快闪存储器&#xff08;英语&#xff1a;Flash Memory&#xff09;&#xff0c;是一种电子式可清除程序化只读存储器的形式&#xff0c;允许在操作中被多次擦或写的存储器。这种科技主要用于一般性数据存储&#xff0c;以及在电脑与其他数字产品间交换传输数…

前端中框架配置中常用配置属性学习

package.json 1、homepage package.json 其实还有很多属性可以配置的&#xff0c;这里就介绍一个 homepage 属性的作用。 homepage 的作用是设置应用的跟路径&#xff0c;我们的项目打包后是要运行在一个域名之下的&#xff0c;有时候可能是运行在跟域名下&#xff0c;也有可…

绘制流程图的方法

流程图可以简单地描述一个过程&#xff0c;是对过程、算法、流程的一种图像表示&#xff0c;在技术设计、交流及商业简报等领域有广泛的应用。流程图可分为&#xff1a;数据流程图和作业流程图。 1、程序流程图的作用 程序流程图的作用程序流程图的作用程序流程图的作用 程序流…

iOS pod引入的第三方库Lottie,报错排查

报错1: 找不到头文件 解决方案 Build Setting -> Header Search Paths 没有添加 $(PODS_ROOT) 后边选择recursive&#xff08;意思是递归查找子目录&#xff09; 报错2: Undefined symbol: OBJC_CLASS$_LOTAnimationView 如果还引入不对,直接把pod下载的lottie-ios中…

深度学习Python学习笔记(一)

我们都知道电路设计上是有一定的逻辑性&#xff0c;最基本的就是门电路单元。无论是与、非、或门&#xff0c;最终都会输出一个1&#xff08;是&#xff09;或0&#xff08;不是&#xff09;的值。然后我们从生物的角度看神经网络&#xff0c;神经网络的最基础单元就是神经元&a…

extern使用注意事项与语法简述

1.使用extern时要严格对应声明的格式&#xff0c;定义的是数组类型&#xff0c;extern char a[];而不能是extern char *a; 2.如果要在*.c文件中引用另一个文件中的一个全局变量&#xff0c;那就应该放在*.h中用extern来声明这个全局变量。 3.函数声明和定义前面extern没有实际…

sourceTree回滚代码到指定版本

1、打开sourceTree&#xff0c;选中分支&#xff0c;找到需要回滚的版本&#xff0c;右击选择“将xx重置到此次提交” 2、选择强行合并 3、找到最新的版本&#xff0c;右击&#xff0c;选择“将xx重置到此这提交”选择“软合并” 4、提交代码&#xff0c;这时候你会发现修改了…