gpt4 book ai didi

node.js - yeoman 生成器中的 ComposeWith 不发出结束事件,因此不驱动 'on' 方法

转载 作者:搜寻专家 更新时间:2023-11-01 00:23:25 25 4
gpt4 key购买 nike

背景

我正在为 Angular SPA(单页应用程序)创建脚手架生成器。它将依赖于标准角度生成器('yo angular')设置的环境,并且还依赖于标准角度子生成器来生成应用程序所需的一些额外服务和 Controller 。换句话说,我正在“装饰”一个基本的角度应用。

如果用户之前安装了角度应用程序,生成器将正常工作(我查找标记文件并在我的代码中设置 bool 值“angularAppFound”)。但是,我希望它也是“一站式”的,因为如果他们还没有设置角度应用程序,我的生成器会在我安装额外的角度工件之前为他们调用角度生成器 在单次运行中

显然,如果没有角度应用程序,我的依赖任务将无法工作。

数据

我的代码是这样的:

  // need this to complete before running other task
subgeneratorsApp: function () {
if (!this.angularAppFound) {
var done = this.async();

this.log('now creating base Angular app...');
// doesn't work (does not drive .on)
//this.composeWith('angular', {args: [ this.appName ]} )
// works (drives .on)
this.invoke('angular', {args: [ this.appName ]} )
.on('end',function(){
this.log('>>>in end handler of angular base install');
done();
}.bind(this));

}
},

// additional steps to only run after full angular install
subgeneratorServices: function () {
Object.keys(this.artifacts.services).forEach( function (key, index, array) {
this.composeWith('angular:service', {args: [ this.artifacts.services[key] ]} );
}.bind(this));
},

subgeneratorControllers: function () {
Object.keys(this.artifacts.controllers).forEach( function (key, index, array) {
this.composeWith('angular:controller', {args: [ this.artifacts.controllers[key] ]} );
}.bind(this));
},

我根据经验确定,通过查看日志和结果,'composeWith' 不会驱动 .on 方法,而 'invoke' 会。

如果 .on 方法没有被驱动,done() 也没有被驱动,并且生成器在 Angular 基础安装后停止并且不驱动后续步骤(因为生成器认为该步骤永远不会完成)。

我可以使用调用,除了它已被弃用:

(!) generator#invoke() is deprecated. Use generator#composeWith() - see http://yeoman.io/authoring/composability.html

问题

我已阅读 herehere生成器不应该相互依赖:

When composing generators, the core idea is to keep both decoupled. They shouldn't care about the ordering, they should run in any order and output the same result.

那么我应该如何处理我的情况,因为排序很重要(而不是使用“invoke”)?在不牺牲“一站式”处理的情况下,我想不出任何其他方式来重新组织我的生成器。

我应该简单地说用户必须在单独的步骤中安装 Angular 并且不允许“一站式”处理吗?

'composeWith' 不会发出 'end' 事件是设计使然吗?

如果没有,您是否建议我打开错误报告,或者是否有其他方法可以做到这一点(未弃用)?

非常感谢。

最佳答案

生成器的可组合性使用 priority base run loop 排序.因此,有可能在运行您的之前等待另一个生成器完成。

虽然这里棘手的部分是,一旦触发了结束事件,生成器就完成了运行。它不会安排任何 future 的任务 - end 事件意味着一切都已完成,是时候结束了。公平地说,你不应该需要结束事件。它仍在 Yeoman 中,只是为了向后兼容。

在您的情况下,您需要两个生成器。 app 生成器(根生成器)和您的自定义功能生成器。然后将它们组合在一起:

因此在 generator/app/index.js 中,您将按如下方式组织代码:

writing: {
this.composeWith('angular:app');
},

end: function () {
this.composeWith('my:subgen');
}

generator-angular 庞大且相当复杂。它仍然基于 Yeoman 的旧版本,这意味着将它用作基础生成器可能更难。我相信项目的所有者会很乐意得到一些帮助来升级和改进作曲故事。 - 如果您想知道 Yeoman 合成的更好的开发者用户体验是什么样的,请查看 generator-node谁被设计为组合的基础生成器。

关于node.js - yeoman 生成器中的 ComposeWith 不发出结束事件,因此不驱动 'on' 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33010498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com