在Node.js项目中以编程方式使用Yeoman

4

我希望在NodeJS项目中使用一个yeoman生成器

我安装了yeoman-generatorgenerator-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个回答

6
@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');
});

2

env.create() 只是实例化一个生成器 - 它并不运行它。

要运行它,你可以调用 generator.run()。但这并不理想。

在我看来,最好的方法是这样:

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环境类的相关文档可以在此处找到:http://yeoman.io/environment/Environment.html 另请参见:http://yeoman.io/authoring/integrating-yeoman.html

太棒了!但是存在一个小问题...生成器试图从项目路径加载模板,当然会崩溃:fs.js:432 return binding.open(pathModule._makeLong(path), stringToFlags(flags), mode); ^ Error: ENOENT, no such file or directory '/Users/username/Downloads/testGenerators/templates/_editorconfi‌​g'当文件在 node_modules/generator-git/app/templates 中时,如何更改生成器的路径呢? (是的,使用 process.chdir(),但是如何使用呢) - Kiko Beats
你似乎在施展黑魔法,也许需要重新审视你的概念基础并简化它以更好地配合实际 API 进行工作。你可以使用 this.sourceRoot('path/') 更改模板目录。 - Simon Boudrias

1

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
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接