Yeoman Generator 开发

Yeoman 是干什么的?

Yeoman 是一个脚手架生成工具,负责生成一个项目的基本解构,能够节省重复劳动,提升开发体验。

开发

Yeoman 为我们提供了 Generator 的基类,于是:

1
2
3
4
5
6
7
8
const generators = require("yeoman-generator");

module.exports = generators.Base.extend({
constructor: function () {
generators.Base.apply(this, arguments)
// your logic
}
})

生命周期

一个 Yeoman Generator 被创建后(构造函数必然是最先被调用的),会依次调用它原型上的方法,且每一个方法中的 this 都被绑定为 Generator 实例本身,调用的顺序如下:

  1. initializing:初始化一些状态之类的,通常是和用户输入的 options 或者 arguments 打交道,这个后面说

  2. prompting:和用户交互的时候(命令行问答之类的)调用

  3. configuring:保存配置文件(如 .babelrc 等)

  4. default:其他方法都会在这里按顺序统一调用

  5. writing:在这里写一些模板文件

  6. conflicts:处理文件冲突,比如当前目录下已经有了同名文件

  7. install:开始安装依赖

  8. end:擦屁股的部分… Say Goodbye maybe…

上面只是调用顺序,后面的说明是建议,也就是说你完全可以在 install 的部分写文件,在 configuring 的时候就开始安装依赖,不过这样的话,就不保证行为的正确性了,更不要说维护上的问题了,所以,别这样,按照它的强制范式来吧。

这些运行周期方法,除了可以是函数外,还可以是对象,我以 babelsub-generator 为例子:

1
2
3
4
5
6
7
8
writing: {
files: function () {
// 写 `.babelrc` 文件
},
pkg: function () {
// 给 package.json 文件上添加依赖项
}
}

对象里的每一个函数会被依次执行。是写成一个函数,还是分成多个函数写成一个对象,都可以,我个人倾向于后者。

参考资料: