我正在开发一个自定义生成器,最初是使用 grunt-init 编写的。我注意到 grunt-init 会自动将根目录下的所有文件处理为模板,但是在 yeoman 生成器中,你需要使用 .template() 方法来实现这一点。我知道如何使用 .template() 处理单个文件,但是是否可以处理整个目录?
我正在开发一个自定义生成器,最初是使用 grunt-init 编写的。我注意到 grunt-init 会自动将根目录下的所有文件处理为模板,但是在 yeoman 生成器中,你需要使用 .template() 方法来实现这一点。我知道如何使用 .template() 处理单个文件,但是是否可以处理整个目录?
这个问题很烦人。我第一次使用yeoman时遇到了这个问题。我认为下面的代码片段可以帮助你。
这个问题很烦人。我第一次使用yeoman时遇到了这个问题。我认为下面的代码片段可以帮助你。
this.directory('scripts', 'scripts');// script is folder name
查看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);
}
}
};
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}
);
},
如果您使用的是全局模式,则目标路径应为文件夹。
this.directory('scripts')
.. 从源代码中学到的:http://yeoman.github.io/generator/actions.js.html - Diego