我正在开发一个自定义生成器,它是我最初用grunt-init编写的。我注意到的一个区别是grunt-init会自动将根目录中的所有文件作为模板处理,但是对于yeoman生成器,您必须使用.template()来完成此操作。我熟悉如何使用.template()处理任何单个文件,但是否可以处理整个目录?
发布于 2013-12-19 17:14:10
这是一个令人讨厌的问题。我第一次使用yeoman时遇到了这个问题。我认为下面的代码片段可以帮助你。
this.directory('scripts', 'scripts');// script is folder name发布于 2013-12-01 00:14:32
看一下Yeoman生成器代码,似乎没有一种内置的方法来做到这一点。我解决这个问题的方法是从内置的生成器代码中复制一些代码,然后根据需要对其进行修改。我根据_前缀约定确定文件是否是模板,因为我想重命名文件以排除该前缀,但您可以将每个文件视为模板,这样就可以很好地工作。这将复制目录中的所有文件,所以我还排除了您在OSX上默认找到的.DS_STORE文件,但由于这是一个特定的情况,所以我没有在这里包含它。
require('path');
MyGenerator.prototype._processDirectory = function(source, destination) {
var root = this.isPathAbsolute(source) ? source : path.join(this.sourceRoot(), source);
var files = this.expandFiles('**', { dot: true, cwd: root });
for (var i = 0; i < files.length; i++) {
var f = files[i];
var src = path.join(root, f);
if(path.basename(f).indexOf('_') == 0){
var dest = path.join(destination, path.dirname(f), path.basename(f).replace(/^_/, ''));
this.template(src, dest);
}
else{
var dest = path.join(destination, f);
this.copy(src, dest);
}
}
};发布于 2017-04-09 02:03:13
Yeoman使用mem-fs-editor,它支持glob模式。然而,文档并不是非常清楚,您可能会错过这一点。这是copyTpl的文档,说明它接受与copy相同的选项。因此,由于copy支持glob模式,因此也支持copyTpl。
在您的yeoman生成器上,您可以随时执行以下操作:
const from = 'myFolder/**.js'
const to = 'project/'
this
.fs
.copyTpl(
this.templatePath(from),
this.destinationPath(to),
this.props, {interpolate: /<%=([\s\S]+?)%>/g}
);
},不是这样的,如果你使用的是glob模式,目标路径应该是一个文件夹。
https://stackoverflow.com/questions/20139196
复制相似问题