可组合性

可组合性是一种将较小的部分组合起来构成一个大型事物的方法。有点像 变形金刚®

Yeoman 提供了多种方法供生成器构建通用基础。没有必要重写相同的函数,因此提供了 API 以在其他生成器中使用生成器。

在 Yeoman 中,可组合性可以通过两种方式启动

  • 生成器可以决定将其自身与另一个生成器组合(例如,generator-backbone 使用 generator-mocha)。
  • 最终用户也可以启动组合(例如,Simon 想要使用 SASS 和 Rails 生成一个 Backbone 项目)。注意:最终用户启动的组合是一个计划的功能,目前尚不可用。

this.composeWith()

composeWith 方法允许生成器与另一个生成器(或子生成器)并行运行。这样它就可以使用来自其他生成器的功能,而不必自己完成所有操作。

在组合时,不要忘记 运行上下文和运行循环。在给定的优先级组执行中,所有组合的生成器都将在该组中执行函数。之后,这将对下一组重复。生成器之间的执行顺序与调用 composeWith 的顺序相同,请参见 执行示例

API

composeWith 接受两个参数。

  1. generatorPath - 指向要组合的生成器的完整路径(通常使用 require.resolve())。
  2. 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-backbonegenerator-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"