# Yeoman 是干什么的?
Yeoman 是一个脚手架生成工具,负责生成一个项目的基本解构,能够节省重复劳动,提升开发体验。
# 开发
Yeoman 为我们提供了 Generator 的基类,于是:
const generators = require("yeoman-generator");
module.exports = generators.Base.extend({
constructor: function () {
generators.Base.apply(this, arguments)
// your logic
}
})
生命周期
一个 Yeoman Generator 被创建后(构造函数必然是最先被调用的),会依次调用它原型上的方法,且每一个方法中的 this 都被绑定为 Generator 实例本身,调用的顺序如下:
initializing
:初始化一些状态之类的,通常是和用户输入的 options 或者 arguments 打交道,这个后面说prompting
:和用户交互的时候(命令行问答之类的)调用configuring
:保存配置文件(如 .babelrc 等)default
:其他方法都会在这里按顺序统一调用writing
:在这里写一些模板文件conflicts
:处理文件冲突,比如当前目录下已经有了同名文件install
:开始安装依赖end
:擦屁股的部分... Say Goodbye maybe...
上面只是调用顺序,后面的说明是建议,也就是说你完全可以在 install
的部分写文件,在 configuring
的时候就开始安装依赖,不过这样的话,就不保证行为的正确性了,更不要说维护上的问题了,所以,别这样,按照它的强制范式来吧。
这些运行周期方法,除了可以是函数外,还可以是对象,我以 babel
的 sub-generator
为例子:
writing: {
files: function () {
// 写 `.babelrc` 文件
},
pkg: function () {
// 给 package.json 文件上添加依赖项
}
}
对象里的每一个函数会被依次执行。是写成一个函数,还是分成多个函数写成一个对象,都可以,我个人倾向于后者。