简体   繁体   English

使用Yeoman发电机重复提示

[英]Repeating Prompts with a Yeoman Generator

I am creating a Yeoman Generator to automate creation of few database tables. 我正在创建一个Yeoman Generator,以自动创建一些数据库表。 I need to provide users with a prompt to add multiple columns (combination of ColumnName and DataType below). 我需要向用户提供添加多个列的提示(下面是ColumnName和DataType的组合)。

I have a template saved in my disk where I bind the dynamic names from the user inputs and based upon this template, the final script is generated by the Yeoman Generator. 我有一个保存在磁盘中的模板,在其中绑定用户输入的动态名称,并基于此模板,由Yeoman Generator生成最终脚本。 Can you suggest how to prompt user to enter repetitive combinations of ColumnName/DataType he wants to enter? 您能否建议如何提示用户输入要输入的ColumnName / DataType的重复组合?

var prompts = [{
    type: 'input',
    name: 'name',
    message: 'The Table Name?'
  }, {
    type: 'input',
    name: 'attributeName',
    message: 'Define your Schema - ColumnName?',
    default: 'ID'
  },{
    type: 'input',
    name: 'attributeType',
    message: 'Define your Schema - DataType?',
    default: 'S'
  }
];


  return this.prompt(prompts).then(function (props) {
    this.props = props;
  }.bind(this));

Template content -- User can enter details of 1/2/3/4 or more columns and once he does that the template below should be intelligent enough to create that many column key combinations. 模板内容-用户可以输入1/2/3/4或更多列的详细信息,一旦这样做,下面的模板应该足够智能,可以创建那么多列键组合。

{
  "Type" : "AWS::Table",
  "Properties" : {
    "AttributeDefinitions" :  
          {
            "AttributeName" : "<%= attributeName %>",
            "AttributeType" : "<%= attributeType %>"
          },
          {
            "AttributeName" : "<%= attributeName %>",
            "AttributeType" : "<%= attributeType %>"
          },
    "TableName" : <%= name %>,

    }
}

You can add a recursive function inside the prompting() hook. 您可以在prompting()挂钩内添加一个递归函数。 It has to be made sure that the recursive function returns this.prompts else the execution might stop. 必须确保递归函数返回this.prompts 。提示运行可能会停止。

My strategy works like below 我的策略如下

  • Declare a recursive function that repeats based on one of the input 声明一个基于输入之一重复的递归函数

  • Populate the props as you recurse through in this.columns 在此this.columns递归时填充道具。

  • Pass this instance variable to the template in writing() hook 将此实例变量传递给writing()挂钩中的模板

  • Iterate over the this.columns in the template and populate your columns this.columns模板中的this.columns并填充您的列

  • First entry in this.columns will have the table name and the first column details 在第一个条目this.columns将有表名和第一列细节

Check the code below, you can tweak this to your needs as long as the recursive function is invoked as expected. 检查下面的代码,只要按预期调用递归函数,就可以根据需要进行调整。

There is an extra prompt that asks whether to repeat or not. 有一个额外的提示,询问是否重复。 It can also be discarded with some logic but that is up to you. 也可以通过某种逻辑将其丢弃,但这取决于您。

prompting() 提示()

prompting() {
  // Have Yeoman greet the user.
  this.log(yosay(
    'Welcome to the remarkable ' + chalk.red('generator-react-starter-kit-relay-container') + ' generator!'
  ));

  const tableNamePrompt = [{
    type: 'input',
    name: 'name',
    message: 'The Table Name?'
  }];

  const columnPrompts = [{
    type: 'input',
    name: 'attributeName',
    message: 'Define your Schema - ColumnName?',
    default: 'ID'
  }, {
    type: 'input',
    name: 'attributeType',
    message: 'Define your Schema - DataType?',
    default: 'S'
  }, {
    type: 'confirm',
    name: 'repeat',
    message: 'Do you want to add more columns?',
    default: 'Y'
  }]

  this.columns = [];

  const loop = (relevantPrompts) => {
    return this.prompt(relevantPrompts).then(props => {
      this.columns.push(props);

      return props.repeat ? loop(columnPrompts) : this.prompt([]);

    })
  }

  return loop([...tableNamePrompt, ...columnPrompts]);
}

And then in the writing() hook pass the columns instance variable that you populated earlier. 然后在writing()挂钩中传递您先前填充的columns实例变量。

writing() 写作()

writing() {
  this.fs.copyTpl(
    this.templatePath('Schema.json'),
    this.destinationPath('./Schema.json'),
    {
      columns: this.columns
    }
  );
}

TEMPLATE 模板

{
  "Type" : "AWS::Table",
  "Properties" : {
    "AttributeDefinitions" : [
      <% for (let i=0; i<columns.length; i++) { %>
        {
          "AttributeName": "<%= columns[i].attributeName %>",
          "AttributeType": "<%= columns[i].attributeType %>"
        }
      <% } %>
    ],
    "TableName" : "<%= (columns[0] || {}).name %>"
  }
}

SAMPLE INPUT 样品输入

     _-----_     ╭──────────────────────────╮
    |       |    │      Welcome to the      │
    |--(o)--|    │        remarkable        │
   `---------´   │ generator-react-starter- │
    ( _´U`_ )    │    kit-relay-container   │
    /___A___\   /│        generator!        │
     |  ~  |     ╰──────────────────────────╯
   __'.___.'__   
 ´   `  |° ´ Y ` 

? The Table Name? User
? Define your Schema - ColumnName? ID
? Define your Schema - DataType? Bigint
? Do you want to add more columns? Yes
? Define your Schema - ColumnName? Email
? Define your Schema - DataType? String
? Do you want to add more columns? Yes
? Define your Schema - ColumnName? Password
? Define your Schema - DataType? Text
? Do you want to add more columns? No

OUTPUT OUTPUT

{
  "Type" : "AWS::Table",
  "Properties" : {
    "AttributeDefinitions" : [

        {
          "AttributeName": "ID",
          "AttributeType": "Bigint"
        }

        {
          "AttributeName": "Email",
          "AttributeType": "String"
        }

        {
          "AttributeName": "Password",
          "AttributeType": "Text"
        }

    ],
    "TableName" : "User"
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM