如何使用yeoman生成器将多个文件作为模板处理?

时间:2013-11-22 07:16:55

标签: gruntjs yeoman yeoman-generator grunt-init

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

3 个答案:

答案 0 :(得分:11)

这个问题很烦人。当我第一次使用自耕农时,我遇到了这个。我认为以下代码段可以为您提供帮助。

this.directory('scripts', 'scripts');// script is folder name

答案 1 :(得分:7)

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

答案 2 :(得分:-1)

Yeoman使用mem-fs-editor,它支持glob模式。但是文档不是很清楚,你可能会错过这一点。以下是copyTpl的文档,其中表示它接受与copy相同的选项。因为copy支持glob模式,copyTpl也是如此。

您可以在Yeoman发电机的任何位置执行以下操作:

<=

不是这样,如果您使用的是glob模式,则目标路径应该是一个文件夹。