yeoman-environment

11 3月

generator都是在yeoman-environment里运行的,它与所有的UI组件解耦,可以被任何工具抽象出来。我们运行yo指令,本质上都是在它基础上运行一个终端的UI外观。

lookup()查找本地安装的generator,可以通过getGeneratorsMeta()方法查看本地安装的generator的元信息:

const yeoman = require('yeoman-environment');
const env = yeoman.createEnv();

env.lookup(function () {
    console.log(env.getGeneratorsMeta());
    env.run('test my-app --ts');
});

// 本地安装的generator的元信息:
// {
//  'test:app':
//    { resolved: '/Users/jack/code/base/generator-test/generators/app/index.js',
//      namespace: 'test:app' },
//   'test:app2':
//    { resolved: '/Users/jack/code/base/generator-test/generators/app2/index.js',
//      namespace: 'test:app2' }
// }

其他(多个generator组合使用)

generator可以组合使用,在一个generator中借助另一个generator(或子generator)的能力一起完成任务。执行顺序与调用this.composeWith(generatorPath, options)的顺序相同。

参数generatorPath常用require.resolve()来获取generator路径。options会传递给该generator。

this.composeWith(require.resolve('generator-bootstrap/generators/app'), {preprocessor: 'sass'});

还支持this.composeWith(object)形式,直接调用Generator类。参数object必须有Generator,path这两个属性。

const NodeGenerator = require('generator-node/generators/app/index.js');

this.composeWith({
  Generator: NodeGenerator,
  path: require.resolve('generator-node/generators/app')
});

例子:

// In my-generator/generators/turbo/index.js
module.exports = class extends Generator {
  prompting() { this.log('prompting - turbo'); }
  writing() { this.log('writing - turbo'); }
};

// In my-generator/generators/electric/index.js
module.exports = class extends Generator {
  prompting() { this.log('prompting - zap'); }
  writing() { this.log('writing - zap'); }
};

// In my-generator/generators/app/index.js
module.exports = class extends Generator {
  initializing() {
    this.composeWith(require.resolve('../turbo'));
    this.composeWith(require.resolve('../electric'));
  }
};

// 结果
// prompting - turbo
// prompting - zap
// writing - turbo
// writing - zap

发表评论

电子邮件地址不会被公开。 必填项已用*标注