Yeoman composeWith只在subgenerator中调用构造函数

时间:2015-05-29 13:40:57

标签: javascript yeoman yeoman-generator

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

我的generator-package 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的概念吗?

还是有另一种解决方法吗?

1 个答案:

答案 0 :(得分:4)

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

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

Yeoman的作品必须是独立的。发电机保持解耦是非常重要的。为了强制执行此操作,yeoman-generator不为运行循环优先级以外的组合提供流控制。

您需要重新考虑代码并将这些生成器分离。