11

我正在开发一个我最初用 grunt-init 编写的自定义生成器。我注意到的一个区别是 grunt-init 自动将 root 中的所有文件作为模板处理,但是使用 yeoman 生成器,您必须使用 .template() 来执行此操作。我熟悉如何使用 .template() 处理任何单个文件,但是否可以处理整个目录?

4

3 回答 3

11

这个问题很烦人。我第一次使用 yeoman 时遇到了这个问题。我认为下面的代码片段可以帮助你。

this.directory('scripts', 'scripts');// script is folder name
于 2013-12-19T09:14:09.820 回答
7

查看 Yeoman 生成器代码,似乎没有内置的方法可以做到这一点。我解决这个问题的方法是从内置的生成器代码中复制一些代码并根据我的需要进行修改。我根据_前缀约定确定文件是否为模板,因为我想重命名文件以排除该前缀,但您可以将每个文件视为模板,它会正常工作。这将复制目录中的所有文件,所以我也做的是排除.DS_STORE您在 OSX 上默认找到的文件,但由于这是一个特定情况,我没有在此处包含该文件。

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);
        }
    }
};
于 2013-11-30T16:14:31.933 回答
0

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 模式,则目标路径应该是一个文件夹。

于 2017-04-08T18:03:13.400 回答