【问题标题】:Yeoman composeWith only calling constructor in subgeneratorYeoman composeWith 仅在子生成器中调用构造函数
【发布时间】:2015-05-29 13:40:56
【问题描述】:

我正在尝试使用composeWith 在同一个生成器包中调用子生成器。然而由于某种原因,只调用了被调用生成器的构造函数。

我的生成器包generator-test 如下所示:

package.json
generators
-- app
  -- index.js
-- base
  -- index.js

我在app 中的主生成器如下所示:

'use strict';

var yeoman = require('yeoman-generator');
var yosay = require('yosay');

module.exports = yeoman.generators.Base.extend({
    constructor: function () {
        console.log('constructing app');
        yeoman.generators.Base.apply(this, arguments);
    },
    initializing: function() {
        console.log('initializing app');
        var done = this.async();
        this.composeWith('test:base',{ options: { } })
            .on('end', function() {
                done();
            });
    }
});

我在base中的子生成器:

'use strict';
var yeoman = require('yeoman-generator');

module.exports = yeoman.generators.Base.extend({
    constructor: function () {
        console.log('constructed base');
        yeoman.generators.Base.apply(this, arguments);
    },
    initializing: function() {
        console.log('initialized base');
    }
});

这应该会生成 4 个控制台输出,但我只得到前三个:

constructing app
initializing app
constructed base

initialized base 从不显示。为什么?我是不是误解了composeWith的概念?

或者有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: javascript yeoman yeoman-generator


    【解决方案1】:

    这不起作用,因为您不能等待组合生成器结束。

    调用this.async() 会暂停运行循环,直到调用回调。在这种情况下,它永远不会被调用,因为子生成器在调用回调之前不会开始运行(但回调等待子生成器运行)。基本上,你已经死锁了你的节点进程。

    Yeoman 中的组合必须是独立的。生成器保持解耦非常重要。为了强制执行这一点,yeoman-generator 除了运行循环优先级之外,不为组合提供流控制。

    您需要重新考虑您的代码并将这些生成器解耦。

    【讨论】:

    • 感谢您的回答。那么这是否意味着先调用主生成器的初始化方法,然后调用子生成器,然后主生成器才继续?或者如果我想要这种功能,从子生成器而不是基类扩展会更好吗?
    • 主要的生成器方法总是在它们自己的优先级循环中首先运行。
    • 那么所有的都先运行,然后才启动子生成器?
    • 如果是这样,我如何才能在主生成器之前运行多个生成器的共同任务?
    • 你不能,而且你不应该关心运行的顺序。如果你关心顺序,那么你就不需要组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多