Использование Yeoman программно в проекте nodejs
Я хочу использовать генератор йоменов внутри проекта NodeJS
Я установил yeoman-generator
а также generator-git
(генератор, который я хочу использовать) в качестве локальной зависимости, и на данный момент мой код выглядит так:
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);
очевидно, что последняя строка не работает и не создает эшафот.
Вопрос: как?
Важно отметить, что я хочу оставаться на локальном уровне зависимости!
3 ответа
Решение @simon-boudrias работает, но после того, как я изменил process.chdir()
, this.templatePath()
а также this.destinationPath()
возвращает тот же путь.
Я мог бы использовать this.sourcePath(), чтобы настроить путь к шаблону, но необходимость менять его для каждого генератора yeoman не так полезна. После поиска в yo-cli я нашел следующие работы, не влияющие на путь.
var env = require('yeoman-environment').createEnv();
env.lookup(function() {
env.run('generator-name');
});
env.create()
только создать экземпляр генератора - он не запускается.
Чтобы запустить его, вы можете позвонить generator.run()
, Но это не идеально.
Лучший способ IMO был бы таким:
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');
При необходимости убедитесь, что process.chdir()
в правильном каталоге перед запуском вашего генератора.
Соответствующую документацию по классу Yeoman Environment можно найти здесь: http://yeoman.io/environment/Environment.html
Также смотрите: http://yeoman.io/authoring/integrating-yeoman.html
yeoman-test
Модуль также очень полезен, если вы хотите передать предопределенные ответы на ваши запросы. Это сработало для меня.
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
});