编写自己的Yeoman生成器-4.组合性

组合性是一种将较小的部件组合在一起构成一件大事的方法。排序像Voltron®

Yeoman为生成器提供了多种方式来建立共同点。重写相同的功能没有任何意义,因此提供了一个API来在其他生成器中使用生成器。

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

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

this.composeWith()

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

在编写时,不要忘记运行上下文和RunLoop。在给定的优先级组执行中,所有组合的生成器将执行该组中的功能。之后,这将重复下一组。生成器之间的执行与composeWith调用的顺序相同,请参阅执行示例

API

composeWith 有两个参数。

  1. generatorPath- 指向要编写的生成器的完整路径(通常使用require.resolve())。
  2. options - 包含选项的对象,一旦运行就传递给组合生成器。

peerDependencies生成器组合时:

1
this.composeWith(require.resolve('generator-bootstrap/generators/app'), {preprocessor: 'sass'});

require.resolve() 返回Node.js加载提供的模块的路径。

注意:如果你需要传递arguments到基于版本的生成器yeoman-generator年龄大于1.0,你可以通过提供一个做到这一点Arrayoptions.arguments关键。

即使它不是一种鼓励的做法,您也可以将生成器命名空间传递给composeWith。在这种情况下,Yeoman将尝试peerDependencies在最终用户系统上找到作为或全局安装的生成器。

1
this.composeWith('backbone:route', {rjs: true});

执行示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 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,这将导致:

1
2
3
4
prompting - turbo
prompting - zap
writing - turbo
writing - zap

您可以通过反转调用来更改函数调用顺序composeWith

请记住,您可以使用npm上提供的其他公共生成器进行组合。

对于可组合的更复杂的例子,检查出generator-generator,它由被generator-node

依赖项或peerDependencies

npm允许三种类型的依赖项:

  • dependencies安装在本地的生成器。它是控制所用依赖项版本的最佳选择。这是首选方案。
  • peerDependencies作为兄弟姐妹安装在生成器旁边。例如,如果generator-backbone声明generator-gruntfile为对等依赖项,则文件夹树将以这种方式显示:

    1
    2
    ├───generator-backbone/
    └───generator-gruntfile/
  • devDependencies用于测试和开发实用程序。这不是必需的。

使用时peerDependencies,请注意其他模块可能还需要所请求的模块。注意不要通过请求特定版本(或窄范围的版本)来创建版本冲突。Yeoman的建议peerDependencies是始终要求更高或等于(> =)或任何(*)可用版本。例如:

1
2
3
4
5
6
{
"peerDependencies": {
"generator-gruntfile": "*",
"generator-bootstrap": ">=1.0.0"
}
}

注意:从npm @ 3开始,peerDependencies不再自动安装。要安装这些依赖项,必须手动安装它们:npm install generator-yourgenerator generator-gruntfile generator-bootstrap@">=1.0.0"

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :