编写自己的Yeoman生成器-10.将Yeoman集成到其他工具中

每次运行生成器时,您实际上都在使用yeoman-environment。环境是一个与任何UI组件分离的基础系统,可以通过任何工具进行抽象。当你运行时yo,你基本上只是在核心Yeoman环境之上运行终端UI外观。

基础

您需要知道的第一件事是环境系统包含在yeoman-environment包中。您可以通过运行来安装它:

1
npm install --save yeoman-environment

该模块提供了检索已安装的生成器,注册和运行生成器的方法。它还提供了生成器正在使用的用户界面适配器。我们提供完整的API文档(这是可用方法的简洁列表。)

运用 yeoman-environment

一个简单的用法示例

在我们转向yeoman-environment更深层次的主题之前,让我们从一个简单的用法示例开始。

在这个例子中,让我们假设npm想要npm init为脚手架提供一个命令package.json。阅读文档的其他页面,您已经知道如何创建生成器 - 所以让我们假设我们已经有了generator-npm。我们将看到如何调用它。

第一步是实例化一个新的环境实例。

1
2
var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();

然后,我们将要注册generator-npm以便以后使用。你有两个选择:

1
2
3
4
5
6
7
8
// 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');

请注意,您可以根据需要注册任意数量的生成器。已注册的生成器仅在整个环境中可用(例如,允许可组合性)。

此时,您的环境已准备好运行npm:app

1
2
3
4
5
// 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可运行的文件中,您就可以在yo不使用的情况下运行Yeoman生成器。

查找安装的生成器

但是,如果您希望提供对用户计算机上安装的每个Yeoman生成器的访问权限,该怎么办?然后,您需要执行用户磁盘的查找。

1
2
3
env.lookup(function () {
env.run('angular');
});

Environment#lookup()一旦Yeoman完成搜索已安装的生成器,就会调用一个回调函数。每个找到的生成器都将在环境中注册。

如果命名空间冲突,本地生成器将覆盖全局生成器。

获取有关注册生成器的数据

调用Environment#getGeneratorsMeta()将返回描述查找任务注册的元数据的对象。

每个对象键都是生成器命名空间,值对象包含以下键:

  • resolved:生成器的已解析路径
  • namespace:生成器的命名空间

例如:

1
2
3
4
5
6
{
"webapp:app": {
"resolved": "/usr/lib/node_modules/generator-webapp/app/index.js",
"namespace": "webapp:app"
}
}

注意:使用注册的发电机#registerStub()将”unknown”作为resolved值。

提供自定义用户界面(UI)

Yeoman使用适配器作为抽象层,允许IDE,代码编辑器等轻松提供运行生成器所需的用户界面。

适配器是负责处理与用户的所有交互的对象。如果要从经典命令行提供不同的交互模型,则必须编写自己的适配器。每个与用户交互的方法都是通过这个适配器(主要是:提示,记录和区分)。

默认情况下,Yeoman提供终端适配器。我们的测试助手提供了一个测试适配器,他会嘲笑提示并使输出静音。您可以将它们用作您自己实现的参考。

适配器应至少提供三种方法。

Adapter#prompt()

它提供了问答功能(例如,当您启动时yo,会向用户提示一组可能的操作)。它的签名和行为遵循Inquirer.js的这些。当生成器调用时this.prompt,调用最终由适配器处理。

Adapter#diff()

遇到冲突时内部调用,并且用户要求旧文件和新文件之间存在差异(两个文件内容都作为参数传递)。

Adapter#log()
它既是一个功能,也是一个用于通用输出的对象。有关lib/util/log.js要提供的方法的完整列表,请参阅。

示例实现

这是使用的模块/插件/应用程序列表yeoman-environment。你可以用它们作为灵感。

Powered by Hexo and Hexo-theme-hiker

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

访客数 : | 访问量 :