Javascript 在子生成器中只调用构造函数的Yeoman composeWith

Javascript 在子生成器中只调用构造函数的Yeoman composeWith,javascript,yeoman,yeoman-generator,Javascript,Yeoman,Yeoman Generator,我试图使用composeWith,调用同一个生成器包中的子生成器。然而由于某种原因,只调用被调用生成器的构造函数 我的发电机包发电机测试如下所示: package.json generators -- app -- index.js -- base -- index.js 'use strict'; var yeoman = require('yeoman-generator'); var yosay = require('yosay'); module.exports = yeo

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

我的发电机包
发电机测试
如下所示:

package.json
generators
-- app
  -- index.js
-- base
  -- index.js
'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();
            });
    }
});
我在
应用程序中的主生成器如下所示:

package.json
generators
-- app
  -- index.js
-- base
  -- index.js
'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
不提供除运行循环优先级之外的合成流控制


你需要重新思考你的代码,并将这些生成器解耦。

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

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

约曼语的构成必须是独立的。发电机保持解耦非常重要。为了加强这一点,
yeoman generator
不提供除运行循环优先级之外的合成流控制


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

谢谢您的回答。这是否意味着首先调用主生成器的初始化方法,然后调用子生成器,然后才继续主生成器?或者如果我想要这种功能,从子生成器而不是基类进行扩展会更好吗?主生成器方法总是在它们自己的优先级循环中首先运行。所以所有的方法都先运行,然后才启动子生成器?如果是,我怎么能在主生成器之前运行多个生成器的公共任务?你不能,你不应该关心运行的顺序。如果你关心顺序,那么你就不需要作文了。谢谢你的回答。这是否意味着首先调用主生成器的初始化方法,然后调用子生成器,然后才继续主生成器?或者如果我想要这种功能,从子生成器而不是基类进行扩展会更好吗?主生成器方法总是在它们自己的优先级循环中首先运行。所以所有的方法都先运行,然后才启动子生成器?如果是,我怎么能在主生成器之前运行多个生成器的公共任务?你不能,你不应该关心运行的顺序。如果你关心顺序,那么你就不需要构图。