Kiko Beats
Kiko Beats

Reputation: 129

Using Yeoman programmatically inside nodejs project

I want to use an yeoman generator inside a NodeJS project

I installed yeoman-generatorand generator-git (the generator that I want use) as locally dependency, and, at this moment my code is like this:

var env = require('yeoman-generator')();
var path = require('path');
var gitGenerator = require('generator-git');
var workingDirectory = path.join(process.cwd(), 'install_here/');
generator = env.create(gitGenerator);

obviously the last line doesn't work and doesn't generate the scaffold.

The question: How to?

Importantly, I want to stay in local dependency level!

Upvotes: 4

Views: 1568

Answers (3)

Jonathan Grupp
Jonathan Grupp

Reputation: 1832

The yeoman-test module is also very useful if you want to pass predefined answers to your prompts. This worked for me.

var yeomanTest = require('yeoman-test');
var answers = require('from/some/file.json');

var context = yeomanTest.run(path.resolve('path/to/generator'));
context.settings.tmpdir = false; // don't run in tempdir
context.withGenerators([
  'paths/to/subgenerators',
  'more/of/them'
])
.withOptions({ // execute with options
  'skip-install': true,
  'skip-sdk': true
})
.withPrompts(answers)  // answer prompts
.on('end', function () {
  // do some stuff here
});

Upvotes: 1

Simon Boudrias
Simon Boudrias

Reputation: 44599

env.create() only instantiate a generator - it doesn't run it.

To run it, you could call generator.run(). But that's not ideal.

The best way IMO would be this way:

var path = require('path');
var env = require('yeoman-generator')();
var gitGenerator = require('generator-git');

// Optionnal: look every generator in your system. That'll allow composition if needed:
// env.lookup();

env.registerStub(gitGenerator, 'git:app');
env.run('git:app');

If necessary, make sure to process.chdir() in the right directory before launching your generator.

Relevant documentation on the Yeoman Environment class can be found here: http://yeoman.io/environment/Environment.html

Also see: http://yeoman.io/authoring/integrating-yeoman.html

Upvotes: 2

TonyTakeshi
TonyTakeshi

Reputation: 5929

@simon-boudrias's solution does work, but after I changed the process.chdir(), this.templatePath() and this.destinationPath() returns same path.

I could have use this.sourcePath() to tweak the template path, but having to change this to each yeoman generator is not so useful. After digging to yo-cli, I found the following works without affecting the path.

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

env.lookup(function() {
    env.run('generator-name');
});

Upvotes: 6

Related Questions