yeoman 子生成器如何访问主生成器上定义的变量?
How can a yeoman sub-generator access variables defined on the main generator?
我正在做一个子生成器,我想将在主生成器上定义的变量传递给这个子生成器:
类似的事情:
writing: function() {
console.log(this.appversion);
var email = this.email; // Variable defined on the main controller.
this.fs.copy(
this.templatePath('somefile.js'),
this.destinationPath('somefile.js')
);
我尝试在主生成器上执行类似下面代码的操作:
this.composeWith('jstack1:controller', {options: {name: 'some-name'}});
和下面关于子发电机的代码
this.option('name', {/* settings */});
但我不确定这样做是否是一个好方法,而且我总是收到以下错误消息:
Error: Did not provide required argument [1mname[22m!
at null. (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:359:33)
at Array.forEach (native)
at Base.checkRequiredArgs (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:355:19)
at argument (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:321:8)
at module.exports.yeoman.generators.Base.extend.initializing (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\generators\controller\index.js:6:10)
at C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:421:16
at processImmediate [as _immediateCallback] (timers.js:383:17)
But I am not sure if it is a good way to do this
是的,这是正确的做法。生成器相互通信的唯一方式是通过选项和参数。 (也可以通过 cache/configurations 和文件系统进行一些通信,但这些不是常用的渠道。)
关于这个错误,我猜你是在扩展 generators.NamedBase
而不是 generators.Base
。
我找到了一种方法,而且非常简单。
首先在主生成器中,我在存储中添加上下文变量:
var templateContext = {
appname: this.appname,
appdescription: this.appdescription,
appversion: this.appversion,
applicense: this.applicense,
appautor: this.appautor,
appemail: this.appemail
};
this.config.set('templateContext',templateContext);
然后在子生成器中我得到了 templateContext:
var templateContext = this.config.get('templateContext');
我正在做一个子生成器,我想将在主生成器上定义的变量传递给这个子生成器: 类似的事情:
writing: function() {
console.log(this.appversion);
var email = this.email; // Variable defined on the main controller.
this.fs.copy(
this.templatePath('somefile.js'),
this.destinationPath('somefile.js')
);
我尝试在主生成器上执行类似下面代码的操作:
this.composeWith('jstack1:controller', {options: {name: 'some-name'}});
和下面关于子发电机的代码
this.option('name', {/* settings */});
但我不确定这样做是否是一个好方法,而且我总是收到以下错误消息:
Error: Did not provide required argument [1mname[22m! at null. (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:359:33) at Array.forEach (native) at Base.checkRequiredArgs (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:355:19) at argument (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:321:8) at module.exports.yeoman.generators.Base.extend.initializing (C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\generators\controller\index.js:6:10) at C:\Users\Alexandre_\generator-jstack1\generator-generator-jstack1\node_modules\yeoman-generator\lib\base.js:421:16 at processImmediate [as _immediateCallback] (timers.js:383:17)
But I am not sure if it is a good way to do this
是的,这是正确的做法。生成器相互通信的唯一方式是通过选项和参数。 (也可以通过 cache/configurations 和文件系统进行一些通信,但这些不是常用的渠道。)
关于这个错误,我猜你是在扩展 generators.NamedBase
而不是 generators.Base
。
我找到了一种方法,而且非常简单。
首先在主生成器中,我在存储中添加上下文变量:
var templateContext = {
appname: this.appname,
appdescription: this.appdescription,
appversion: this.appversion,
applicense: this.applicense,
appautor: this.appautor,
appemail: this.appemail
};
this.config.set('templateContext',templateContext);
然后在子生成器中我得到了 templateContext:
var templateContext = this.config.get('templateContext');