拆分Yeoman提示进入多个单独的组

时间:2016-03-25 16:10:32

标签: yeoman yeoman-generator

如何将自耕农提示分成几部分? 我有一个相当广泛的提示,我想分成每个部分都有标题的部分。

CSS
- prompt1

HTML
-prompt 2

这样的事情:

prompt1: function(){
  var done = this.async();
  condole.log('title 1');
  var prompts = [{
      name: 'prompt1',
      message: 'Prompt 1:',
    }]
},


prompt2: function(){
  var done = this.async();
  condole.log('title 2');
  var prompts = [{
      name: 'prompt2',
      message: 'Prompt 2:',
    }]
},

谢谢!

2 个答案:

答案 0 :(得分:0)

更新作为@Deimyts注释中的注释,原始代码停止工作。这是由于 Inquirer.JS documented here中的API更改。

  
      
  • 基本API接口现在是inquirer.prompt(questions).then()。没有更多的回调功能。
  •   
  • 任何异步问题函数都将承诺视为返回值,而不是要求this.async()
  •   

简而言之,不是使用旧的var done = this.async() API并使用done()解决回调内的提示,而只是从prompting函数(see docs)返回一个承诺

prompt1: function() {
  this.log("HTML")
  return this.prompt([
      // configure prompts as before
    ]).then(function (answers) {
      // callback body as before, but no more calling done()
  }.bind(this));
},

有关详细信息,请参阅下面的@Deimyts答案。

Yeoman使用具有某些预定义优先级的运行循环,您可以使用这些优先级来执行操作。如☞ docs中所述,您可以将一些方法分组为一个优先级。这是一个片段,用于说明生成器,其中提示分为两组HTMLCSS

'use strict';

var generators = require('yeoman-generator');

module.exports = generators.Base.extend({

  constructor: function () {
    generators.Base.apply(this, arguments);
  },

  prompting: {
    prompt1: function() {
      this.log("HTML")
      var done = this.async();
      this.prompt([{
          type    : 'input',
          name    : 'foo',
          message : 'Foo',
        }, {
          type    : 'input',
          name    : 'bar',
          message : 'Bar'
        }], function (answers) {
          this.foo = answers.foo;
          this.bar = answers.bar;
          done();
        }.bind(this));
    },

    prompt2: function() {
      this.log("CSS")
      var done = this.async();
      this.prompt([{
          type    : 'input',
          name    : 'bam',
          message : 'Bam',
        }], function (answers) {
          this.bam = answers.bam;
          done();
        }.bind(this));
    }
  },

  configuring: function () {
    console.log(this.foo, this.bar, this.bam);
  }
});

使用Yeoman的这个功能,您可以进一步模块化您的代码,例如将不同的提示放在单独的代码文件中,并将require / import放入生成器文件中。但基本上上面的片段应该可以解决问题。

如果有帮助,请告诉我。

答案 1 :(得分:0)

在我对示例代码进行了多次修改之前,之前的回答并不适合我。

我无法100%确定,但我认为差异可能是由于yeoman-generator模块的不同版本所致。所以,我在这里录制这个,以防其他人遇到同样的问题。

供参考,我使用yeoman-generator v0.23.4yo v1.8.4node v6.2.2和& npm v3.9.5

修改:

  1. 删除var done = this.async();done()的所有实例。

    async()函数导致生成器在prompt1之后退出,并且从不运行prompt2configuring函数。

  2. 在致电return;

    之前添加this.prompt()

    删除async()会导致生成器在不等待答案的情况下冲过提示。添加return修复此问题。

  3. this.prompt()内的回调函数替换为.then()

    在进行此更改之前,生成器会正确运行提示,但不会保存答案,而configuring只会记录undefined undefined undefined

    原文: this.prompt(prompts, callback(answers).bind(this))

    修订this.prompt(prompts).then(callback(answers).bind(this));

  4. 完整示例:

    'use strict';
    
    var generators = require('yeoman-generator');
    
    module.exports = generators.Base.extend({
    
      constructor: function () {
        generators.Base.apply(this, arguments);
      },
    
      prompting: {
        prompt1: function() {
          this.log("HTML")
          return this.prompt([{
            type    : 'input',
            name    : 'foo',
            message : 'Foo',
          }, {
            type    : 'input',
            name    : 'bar',
            message : 'Bar'
          }]).then(function (answers) {
            this.foo = answers.foo;
            this.bar = answers.bar;
          }.bind(this));
        },
    
        prompt2: function() {
          this.log("CSS")
          return this.prompt([{
            type    : 'input',
            name    : 'bam',
            message : 'Bam',
          }])
          .then(function(answers) {
            this.bam = answers.bam;
          }.bind(this));
        }
      },
    
      configuring: function () {
        console.log(this.foo, this.bar, this.bam);  
        console.log('Config: ', this.config);
      },
    });