每次运行Generator时,实际上都是在使用yeoman环境。 该环境是与任何UI组件分离的基础系统,并且可以由任何工具抽象化。 当运行yo时,基本上只是在核心Yeoman环境之上运行终端UI外观。
11.1 基础
需要知道的第一件事是环境系统包含在yeoman-environment软件包中。 可以通过运行以下命令进行安装:
npm install --save yeoman-environment
该模块提供了检索已安装的Generator,注册和运行Generator的方法。它还提供了Generator正在使用的用户界面适配器。提供了完整的API文档(可用方法的简要清单。)
11.2 使用 yeoman-environment
简单使用的例子
让我们从简单的例子开始,我们在探讨更深层次的话题之前就开始了“yeoman-environment ”的使用。
在此示例中,假设npm想要通过npm init命令来封装package.json。 阅读文档的其他页面,已经知道如何创建Generator。因此,假设我们已经有一个generator-npm。 我们将看到如何调用它。
第一步是实例化一个新的环境实例。
var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();
第二步,我们要注册一个generator-npm,以便以后使用。 有两个选择:
// 方法一:
// Here we register a generator based on its path. Providing the namespace
// is optional.
env.register(require.resolve('generator-npm'), 'npm:app');
// 方法二:
// Or you can provide a generator constructor. Doing so, you need to provide
// a namespace manually
var GeneratorNPM = generators.Base.extend(/* put your methods in here */);
env.registerStub(GeneratorNPM, 'npm:app');
请注意,您可以根据需要注册任意数量的Generator。 已注册的Generator仅在整个环境中可用(例如,允许可组合性)。
至此,您的环境已准备就绪,可以运行npm:app了。
// In its simplest form
env.run('npm:app', done);
// Or passing arguments and options
env.run('npm:app some-name', { 'skip-install': true }, done);
只需要将此代码放在bin可运行文件中,就可以运行Yeoman生成器,而无需使用yo。
查找安装的Generator
如果希望提供对用户计算机上安装的每个Yeoman生成器的访问权限,该怎么办?那么,需要执行用户磁盘的查找。
env.lookup(function () {
env.run('angular');
});
在Yeoman完成搜索已安装的生成器后,Environment#lookup() 会调用一个回调。 找到的每个生成器都将在环境中注册。
如果名称空间冲突,本地生成器将覆盖全局生成器。
获取有关注册Generator的数据
调用Environment#getGeneratorsMeta() 将返回一个对象,该对象描述查找任务注册的元数据。
每个对象键都是一个生成器名称空间,值对象包含以下键:
resolved
: generator的解析路径namespace
: generator的命名空间
例如:
{
"webapp:app": {
"resolved": "/usr/lib/node_modules/generator-webapp/app/index.js",
"namespace": "webapp:app"
}
}
注意:使用#registerStub() 注册的生成器的解析值将为“未知”。
11.3 提供自定义的用户接口(User Interface)
Yeoman使用适配器作为抽象层,以允许IDE,代码编辑器等轻松提供运行生成器所需的用户界面。
适配器是负责处理与用户的所有交互的对象。 如果要提供与传统命令行不同的交互模型,则必须编写自己的适配器。 与用户交互的每种方法都通过此适配器(主要是:提示,日志记录和差异)。
默认情况下,Yeoman提供一个terminal。 测试助手会提供一个测试适配器,可以模拟提示并静音输出。 可以将它们用作自己的实现的参考。
要安装适配器,请使用yeoman.createEnv(args,opts,adapter)的第三个参数。
适配器至少应提供三种方法:
Adapter#prompt()
它提供了问答功能(例如,当您开始时,会向用户提示一系列可能的操作)。
它的签名和行为遵循Inquirer.js的规定。
当生成器调用this.prompt时,该调用最终由适配器处理。
Adapter#diff()
在遇到冲突并且用户要求新旧文件之间进行区分时在内部调用(两个文件的内容均作为参数传递)。
Adapter#log()
它既是用于通用输出的函数,又是对象。 有关提供的方法的完整列表,请参见lib/util/log.js。
11.4 Example implementations
这是使用yeoman环境的模块/插件/应用程序的列表。
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 |