我正在尝试使用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
的概念吗?
还是有另一种解决方法吗?
答案 0 :(得分:4)
这不起作用,因为你不能等待组合生成器的结束。
调用this.async()
暂停运行循环,直到调用回调。在这种情况下,它永远不会被调用,因为子生成器在调用回调之前不会开始运行(但是回调等待子生成器运行)。基本上,你已经死了锁定节点进程。
Yeoman的作品必须是独立的。发电机保持解耦是非常重要的。为了强制执行此操作,yeoman-generator
不为运行循环优先级以外的组合提供流控制。
您需要重新考虑代码并将这些生成器分离。