Yeoman 生成器 - 如何根据提示的参数更改某些文件的内容
Yeoman generator - How to change the content of some file depending on a prompted param
我正在编写一个生成器,其中将提示用户一个参数,我们称之为 option
。根据其答案,我想更改其中一个输出文件:
SomeClass.java
public class SomeClass{
//if option=x I don't want to include this attribute:
private String field1;
//if option=x I want to generate an attribute with the value of the promted attribute
private String ${info};
如何执行上面评论中描述的操作?
index.js
在 prompting()
方法中,您将声明所有提示和包含名称的提示类型。然后在 writing()
中,您将把这些传递给模板,这里是 MyClass.java
module.exports = class extends Generator {
prompting() {
// Have Yeoman greet the user.
this.log(yosay(
'Welcome to the remarkable ' + chalk.red('generator-react-starter-kit-relay-container') + ' generator!'
));
const prompts = [{
type: 'input',
name: 'info',
message: 'INFO IN YOUR CLASS'
}, {
type: 'confirm',
name: 'x',
message: 'YOUR OPTION X'
}];
return this.prompt(prompts).then(props => {
this.props = props;
});
}
writing() {
this.fs.copyTpl(
this.templatePath('MyClass.js'),
this.destinationPath(<YOUR DESTINATION PATH>),
{
info: this.props.info,
x: this.props.x
}
);
}
};
templates/MyClass.java
public class MyClass{
<% if (x) { %>
private String <%= info %>;
<% } else { %>
private String field1;
<% } %>
}
我是这样解决的:
SomeClass.java:
public class SomeClass{
<%_ if (option == 'x') { _%>
private String field1;
<%_ } _%>
private String <%= nombre %>;
这是生成器代码:
module.exports = class extends Generator {
prompting() {
// Have Yeoman greet the user.
this.log(yosay(
'Welcome to the super-duper ' + chalk.red('generator-mygenerator') + ' generator!'
));
const prompts = [{
type: 'input',
name: 'option',
message: 'Option?',
default: 'x'
},
{
type: 'input',
name: 'info',
message: 'Field name?',
default: 'field'
}
];
return this.prompt(prompts).then(props => {
this.props = props;
});
}
writing() {
this.fs.copyTpl(
this.templatePath('SomeClass.java'),
this.destinationPath('SomeClass.java'), this.props);
}
}
我正在编写一个生成器,其中将提示用户一个参数,我们称之为 option
。根据其答案,我想更改其中一个输出文件:
SomeClass.java
public class SomeClass{
//if option=x I don't want to include this attribute:
private String field1;
//if option=x I want to generate an attribute with the value of the promted attribute
private String ${info};
如何执行上面评论中描述的操作?
index.js
在 prompting()
方法中,您将声明所有提示和包含名称的提示类型。然后在 writing()
中,您将把这些传递给模板,这里是 MyClass.java
module.exports = class extends Generator {
prompting() {
// Have Yeoman greet the user.
this.log(yosay(
'Welcome to the remarkable ' + chalk.red('generator-react-starter-kit-relay-container') + ' generator!'
));
const prompts = [{
type: 'input',
name: 'info',
message: 'INFO IN YOUR CLASS'
}, {
type: 'confirm',
name: 'x',
message: 'YOUR OPTION X'
}];
return this.prompt(prompts).then(props => {
this.props = props;
});
}
writing() {
this.fs.copyTpl(
this.templatePath('MyClass.js'),
this.destinationPath(<YOUR DESTINATION PATH>),
{
info: this.props.info,
x: this.props.x
}
);
}
};
templates/MyClass.java
public class MyClass{
<% if (x) { %>
private String <%= info %>;
<% } else { %>
private String field1;
<% } %>
}
我是这样解决的:
SomeClass.java:
public class SomeClass{
<%_ if (option == 'x') { _%>
private String field1;
<%_ } _%>
private String <%= nombre %>;
这是生成器代码:
module.exports = class extends Generator {
prompting() {
// Have Yeoman greet the user.
this.log(yosay(
'Welcome to the super-duper ' + chalk.red('generator-mygenerator') + ' generator!'
));
const prompts = [{
type: 'input',
name: 'option',
message: 'Option?',
default: 'x'
},
{
type: 'input',
name: 'info',
message: 'Field name?',
default: 'field'
}
];
return this.prompt(prompts).then(props => {
this.props = props;
});
}
writing() {
this.fs.copyTpl(
this.templatePath('SomeClass.java'),
this.destinationPath('SomeClass.java'), this.props);
}
}