在子生成器中只调用构造函数

Yeoman composeWith only calling constructor in subgenerator

本文关键字:调用 构造函数      更新时间:2023-09-26

我试图使用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的概念?

或者有其他方法来解决这个问题?

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

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

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

你需要重新考虑你的代码并解耦那些生成器。