写在前面
到这里,相信小伙伴们已经对cli
搭建要使用的工具有了一定了解。如果对相应的工具比较陌生,可以移步本专栏 的前几篇内容。里面有相应介绍。
从这篇开始,我们将一步步得实现cli
中的一些功能。
构建命令
在varlet-cli
中,我们使用gen
作为我们的构建命令,先介绍一下什么是gen
。
gen
为generate
的简写,用法与我们熟知的vuecli
的create
类似,用来创建一个组件库项目。
当然,小伙伴们也可以使用各种自己喜欢的命令名~本篇我们依旧以gen
作为我们的构建命令。
前期准备
我们先将项目的目录结构调整一下。
generators
:用于存放gen
命令构建出项目的模板文件site
:用于存放文档站点src
:不用多说,cli
的核心部分都在这里了
因为本文以
cli
的搭建为主,generators
和site
部分的代码我们不做过多笔墨,有兴趣的小伙伴们可以前往我们的 代码仓库查看
老朋友commander
在之前的《进阶篇:好用的工具(上)》中我们已经对commander
的基本使用做了介绍,接下来就是让它发挥实力的时候了。
Step1.引用
1 | import { Command } from "commander" |
创建gen命令
我们在src/commands/gen
中暴露一个gen
方法用来处理gen
命令
1 | export function gen(name:string){ |
然后我们在入口文件中使用这个gen
方法。
1 |
|
gen要做啥
既然命令已经有了,我们要先明确gen
要做的事情:
- 接收用户输入的项目名称
- 检测当前目录中是否已经存在同名目录,有则提示,无则继续流程
- 提示用户选择模板
- 将用户选择的模板拷贝到目的目录
- 提示用户创建完成
接下来我们将按上面的步骤逐步实现gen
同名检测
我们接受用户输入的name
,并拼接最终路径,通过fs-extra
的pathExistsSync
方法判读该路径是否存在。
如果存在则提示并终止程序。
1 | const dest = resolve(process.cwd(), name) |
我们在
write-cli
项目的同级目录试一下gen
选择模板
我们使用inquirer
来编辑交互
1 | const ret = await inquirer.prompt([ |
这里的choice
就是用户选择的模板类似
拷贝模板
我们先定义模板所在目录,然后拿到项目的基本文件目录以及模板目录,然后将其拷贝到定义项目的目录中。
1 | export const GENERATORS_DIR = resolve(__dirname, '../../generators') |
这样我们就完成了项目的创建。
提示完成
但是这样突然就完成了是不是有些不太友好呢,接下来我们来加入提示。
1 | logger.success('Application generated successfully!') |
最后
以上就是gen
命令的相关内容了,跟varlet-cli
的gen
相比删减了一些不影响正常创建的内容。