从节点脚本调用时如何跳过 Yeoman 生成器步骤
How to skip Yeoman generator step when invoked from node script
我有一个调用我编写的 Yeoman 生成器的节点 js 脚本,我想跳过提示步骤,因为我正在从脚本传递生成器的数据。我搜索了文档,但没有找到与此相关的任何内容。有可能吗?
我的脚本是这样的
const yeoman = require('yeoman-environment');
const env = yeoman.createEnv();
env.lookup(() => {
env.run('mygenerator:subgenerator --moduleName Test3', {'skip-install': true, 'skip-prompting': true }, err => {
console.log('done');
});
});
我的生成器没有什么特别之处:
const BaseGenerator = require('./../base/index.js');
module.exports = class extends BaseGenerator {
constructor(args, opts) {
super(args, opts);
this.props = opts;
const destinationFolder = args.destinationFolder || '';
const moduleName = args.moduleName || '';
this.props = {
moduleName,
destinationFolder,
};
}
prompting() {
//...
}
writing() {
//...
}
};
我知道生成器获取我从脚本传递的数据。我可能有一个生成器来处理输入,另一个生成器只用于写入文件。但是如果只有一个代码并且能够跳过一些步骤就好了。
我在一些 Whosebug 答案中看到人们将 { 'skip-install': true } 选项传递给生成器。然后我尝试传递 { 'skip-prompting': true },但它什么也没做。
谢谢!
编辑
我解决这个问题的方法如下:
我所有的子生成器都扩展了我编写的 BaseGenerator,它是从 Yeoman 扩展而来的。在我的 BaseGenerator 中,我添加了这个方法:
shouldPrompt() {
return typeof this.props.options === 'undefined' ||
(typeof this.props.options.moduleName === 'undefined' &&
typeof this.props.options.destinationFolder === 'undefined');
}
我在我的生成器中只使用了 2 个参数,moduleName 和 destinationFolder。所以,这就是我要检查的全部内容。然后,在子生成器中我添加了这个:
prompting() {
if (this.shouldPrompt()) {
this.log(chalk.red('Reducer generator'));
const prompts = [ /*...*/ ];
return this.prompt(prompts).then((props) => { this.props.options = props; });
}
}
您需要定义 options
或 arguments
以接受来自终端的这些参数:http://yeoman.io/authoring/user-interactions.html
然后,只需使用 JavaScript 到 运行 或不使用 this.prompt()
调用(使用 if/else 结构或适用于您的用例的任何其他条件)
请记住,Yeoman 仍然只是 JS 代码:)
我有一个调用我编写的 Yeoman 生成器的节点 js 脚本,我想跳过提示步骤,因为我正在从脚本传递生成器的数据。我搜索了文档,但没有找到与此相关的任何内容。有可能吗?
我的脚本是这样的
const yeoman = require('yeoman-environment');
const env = yeoman.createEnv();
env.lookup(() => {
env.run('mygenerator:subgenerator --moduleName Test3', {'skip-install': true, 'skip-prompting': true }, err => {
console.log('done');
});
});
我的生成器没有什么特别之处:
const BaseGenerator = require('./../base/index.js');
module.exports = class extends BaseGenerator {
constructor(args, opts) {
super(args, opts);
this.props = opts;
const destinationFolder = args.destinationFolder || '';
const moduleName = args.moduleName || '';
this.props = {
moduleName,
destinationFolder,
};
}
prompting() {
//...
}
writing() {
//...
}
};
我知道生成器获取我从脚本传递的数据。我可能有一个生成器来处理输入,另一个生成器只用于写入文件。但是如果只有一个代码并且能够跳过一些步骤就好了。
我在一些 Whosebug 答案中看到人们将 { 'skip-install': true } 选项传递给生成器。然后我尝试传递 { 'skip-prompting': true },但它什么也没做。
谢谢!
编辑
我解决这个问题的方法如下:
我所有的子生成器都扩展了我编写的 BaseGenerator,它是从 Yeoman 扩展而来的。在我的 BaseGenerator 中,我添加了这个方法:
shouldPrompt() {
return typeof this.props.options === 'undefined' ||
(typeof this.props.options.moduleName === 'undefined' &&
typeof this.props.options.destinationFolder === 'undefined');
}
我在我的生成器中只使用了 2 个参数,moduleName 和 destinationFolder。所以,这就是我要检查的全部内容。然后,在子生成器中我添加了这个:
prompting() {
if (this.shouldPrompt()) {
this.log(chalk.red('Reducer generator'));
const prompts = [ /*...*/ ];
return this.prompt(prompts).then((props) => { this.props.options = props; });
}
}
您需要定义 options
或 arguments
以接受来自终端的这些参数:http://yeoman.io/authoring/user-interactions.html
然后,只需使用 JavaScript 到 运行 或不使用 this.prompt()
调用(使用 if/else 结构或适用于您的用例的任何其他条件)
请记住,Yeoman 仍然只是 JS 代码:)