【问题标题】:Repeating Prompts with a Yeoman Generator使用 Yeoman 生成器重复提示
【发布时间】:2018-02-06 01:58:34
【问题描述】:

我正在创建一个 Yeoman 生成器来自动创建几个数据库表。我需要提示用户添加多列(下面是 ColumnName 和 DataType 的组合)。

我有一个模板保存在我的磁盘中,我在其中绑定来自用户输入的动态名称,并基于此模板,由 Yeoman 生成器生成最终脚本。您能否建议如何提示用户输入他想输入的重复的 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));

模板内容—— 用户可以输入 1/2/3/4 或更多列的详细信息,一旦他这样做,下面的模板应该足够智能,可以创建那么多列组合键。

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

    }
}

【问题讨论】:

    标签: javascript node.js yeoman yeoman-generator


    【解决方案1】:

    您可以在prompting() 挂钩内添加递归函数。必须确保递归函数返回this.prompts,否则执行可能会停止。

    我的策略如下所示

    • 声明一个基于输入之一重复的递归函数

    • this.columns中递归时填充道具

    • 将此实例变量传递给writing()钩子中的模板

    • 遍历模板中的this.columns 并填充您的列

    • this.columns 中的第一个条目将包含表名和第一列详细信息

    检查下面的代码,只要按预期调用递归函数,您就可以根据需要对其进行调整。

    有一个额外的提示询问是否重复。它也可以通过一些逻辑被丢弃,但这取决于你。

    提示()

    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]);
    }
    

    然后在 writing() 钩子中传递您之前填充的 columns 实例变量。

    写作()

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

    模板

    {
      "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 %>"
      }
    }
    

    示例输入

         _-----_     ╭──────────────────────────╮
        |       |    │      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
    

    输出

    {
      "Type" : "AWS::Table",
      "Properties" : {
        "AttributeDefinitions" : [
    
            {
              "AttributeName": "ID",
              "AttributeType": "Bigint"
            }
    
            {
              "AttributeName": "Email",
              "AttributeType": "String"
            }
    
            {
              "AttributeName": "Password",
              "AttributeType": "Text"
            }
    
        ],
        "TableName" : "User"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      相关资源
      最近更新 更多