可组合性是一种将较小的部分组合起来构成一个大型事物的方法。有点像 变形金刚®
Yeoman 提供了多种方法供生成器构建通用基础。没有必要重写相同的函数,因此提供了 API 以在其他生成器中使用生成器。
在 Yeoman 中,可组合性可以通过两种方式启动
- 生成器可以决定将其自身与另一个生成器组合(例如,
generator-backbone
使用generator-mocha
)。 - 最终用户也可以启动组合(例如,Simon 想要使用 SASS 和 Rails 生成一个 Backbone 项目)。注意:最终用户启动的组合是一个计划的功能,目前尚不可用。
this.composeWith()
composeWith
方法允许生成器与另一个生成器(或子生成器)并行运行。这样它就可以使用来自其他生成器的功能,而不必自己完成所有操作。
在组合时,不要忘记 运行上下文和运行循环。在给定的优先级组执行中,所有组合的生成器都将在该组中执行函数。之后,这将对下一组重复。生成器之间的执行顺序与调用 composeWith
的顺序相同,请参见 执行示例。
API
composeWith
接受两个参数。
generatorPath
- 指向要组合的生成器的完整路径(通常使用require.resolve()
)。options
- 一个对象,其中包含在组合生成器运行后传递给它的选项。
与 peerDependencies
生成器组合时
this.composeWith(require.resolve('generator-bootstrap/generators/app'), {preprocessor: 'sass'});
require.resolve()
返回 Node.js 加载提供的模块的路径。
注意:如果您需要根据低于 1.0 版本的 yeoman-generator
传递 arguments
给生成器,可以通过将 Array
作为 options.arguments
键来实现。
即使这不是推荐的做法,您也可以将生成器命名空间传递给 composeWith
。在这种情况下,Yeoman 将尝试查找作为 peerDependencies
或在最终用户系统上全局安装的生成器。
this.composeWith('backbone:route', {rjs: true});
与生成器类组合
composeWith
也可以将其第一个参数作为对象。该对象应定义以下属性
Generator
- 要组合的生成器类path
- 生成器文件的路径
这将使您可以与项目中定义或从其他模块导入的生成器类组合。将 options
作为第二个参数传递给 composeWith
将按预期工作。
// Import generator-node's main generator
const NodeGenerator = require('generator-node/generators/app/index.js');
// Compose with it
this.composeWith({
Generator: NodeGenerator,
path: require.resolve('generator-node/generators/app')
});
执行示例
// In my-generator/generators/turbo/index.js
module.exports = class extends Generator {
prompting() {
this.log('prompting - turbo');
}
writing() {
this.log('writing - turbo');
}
};
// In my-generator/generators/electric/index.js
module.exports = class extends Generator {
prompting() {
this.log('prompting - zap');
}
writing() {
this.log('writing - zap');
}
};
// In my-generator/generators/app/index.js
module.exports = class extends Generator {
initializing() {
this.composeWith(require.resolve('../turbo'));
this.composeWith(require.resolve('../electric'));
}
};
运行 yo my-generator
后,将产生以下结果
prompting - turbo
prompting - zap
writing - turbo
writing - zap
您可以通过反转 composeWith
的调用来更改函数调用顺序。
请记住,您可以与 npm 上可用的其他公共生成器组合。
有关可组合性的更复杂示例,请查看 generator-generator,它由 generator-node 组成。
依赖项或对等依赖项
npm 允许三种类型的依赖项
dependencies
安装在生成器本地。这是控制使用的依赖项版本的最佳选择。这是首选选项。peerDependencies
与生成器一起安装,作为同级。例如,如果generator-backbone
将generator-gruntfile
声明为对等依赖项,则文件夹树将如下所示├───generator-backbone/ └───generator-gruntfile/
devDependencies
用于测试和开发实用程序。这里不需要。
使用 peerDependencies
时,请注意其他模块也可能需要请求的模块。注意不要通过请求特定版本(或版本范围狭窄)来创建版本冲突。Yeoman 建议使用 peerDependencies
始终请求大于或等于 (>=) 或任何 (*) 可用版本。例如
{
"peerDependencies": {
"generator-gruntfile": "*",
"generator-bootstrap": ">=1.0.0"
}
}
注意:从 npm@3 开始,peerDependencies
不再自动安装。要安装这些依赖项,必须手动安装:npm install generator-yourgenerator generator-gruntfile generator-bootstrap@">=1.0.0"