Search code examples
yeoman

Run a yeoman sub-generator using yeoman-environment


I am having trouble running a sub-generator when yeoman is run in embedded form.

The documentation for integrating yeoman in other tools provides this example:

var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();
env.register(require.resolve('generator-mine'), 'mine:app');
env.run('mine:app', done);

This works for my generator mine, too. However, when I try to use the same code to run any sub-generator (mine:client), it does not work correctly. There are two failure modes.

First, if I only register the app generator, and try to run the sub-generator:

var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();
env.register(require.resolve('generator-mine'), 'mine:app');
env.run('mine:client', done);

I get:

You don't seem to have a generator with the name “mine:client” installed.

Second, if I register both the app and sub-generator, and try to run the sub-generator:

var yeoman = require('yeoman-environment');
var env = yeoman.createEnv();
env.register(require.resolve('generator-mine'), 'mine:app');
env.register(require.resolve('generator-mine'), 'mine:client');
env.run('mine:client', done);

Then there is no error message. However, the mine:app generator is run instead of the desired mine:client generator.

Keep in mind that the sub-generator works as expected when invoked directly from the shell.

What am I missing?


Solution

  • env.register() doesn't search the yeoman generator-XXX for all generators/*/index.js it only uses the main: entry from the package.json.

    env.lookup() scans the node install for generator-* and registers all generators it finds.

    Change

    env.register(require.resolve('generator-mine'), 'mine:client');

    To

    env.lookup(() => {  folder
      env.run('mine:client', {}, err => { console.log('done'); });
    });