我可以在 Yeoman 子生成器中定义一个选项,然后从基本生成器中引用该选项吗?

Can I define an option in a Yeoman subgenerator, and then reference that option from the base generator?

我有一个位于基础生成器中的 EJS 模板文件,但需要能够从基础生成器和子生成器中读取选项。

基础生成器

module.exports = generators.Base.extend({
  constructor: function() {
    generators.Base.apply(this, arguments);

    this.option('option1');
  },

  initializing: function() {
    this.composeWith('base:sub-gen', this.options, {
      local: require.resolve('../sub-gen'),
      link: 'strong'
      });
  }
});

副发电机

module.exports = generators.Base.extend({
  constructor: function() {
    generators.Base.apply(this, arguments);

    this.option('option2');
  },
});

模板

Base generator option: <%=this.options.option1 %>
Sub-generator option: <%=this.options.option2 %>

有什么方法可以从我的 ejs 模板中引用子生成器选项吗? 除此之外,我还能如何确保我的基本生成器和我的子生成器都可以访问相同的选项列表?也许可以使用 .yo-rc.json?

经过进一步研究,我找到了解决方案:

  1. 在两个生成器中,在 configuring 步骤中设置配置,但在 default 步骤中读取它们。
  2. 使用 this.config.get('key')this.config.getAll() 读取配置后,将它们保存为您要在 this.imports = this.config.get('option-name').[=32 中使用的生成器的 属性 =]

示例:

基础生成器

module.exports = generators.Base.extend({
  constructor: function() {
    generators.Base.apply(this, arguments);

    this.option('option1');
  },

  initializing: function() {
    this.composeWith('base:sub-gen', this.options, {
      local: require.resolve('../sub-gen'),
      link: 'strong'
      });
  },

  configuring: function () {
    let configs = {
      option1: option1
    };

    this.config.set(configs);
  },

    default: function() {
        let config = this.config.getAll()
        this.imports = this.config.get('subGenOptions');
    },
});

副发电机

module.exports = generators.Base.extend({
  constructor: function() {
    generators.Base.apply(this, arguments);

    this.option('option2');
  },
  configuring: function() {
    let configs = {
        subGenOptions: {
            option2: this.options.option2
        }
    }

    this.config.set(configs)
  },
});

模板(在基础生成器中)

Base generator option: <%=options.option1 %>
Sub-generator option: <%=imports.option2 %>