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

use*_*693 12 gruntjs yeoman yeoman-generator grunt-init

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

小智 11

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

this.directory('scripts', 'scripts');// script is folder name
Run Code Online (Sandbox Code Playgroud)

  • 这将使用模板文件将所有文件从一个目录批量复制到另一个目录. (6认同)
  • @SKuijers np 似乎 Yeoman 最近更新了文档站点,新链接:http://yeoman.github.io/generator/lib_actions_actions.js.html (2认同)

Rya*_*nch 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);
        }
    }
};
Run Code Online (Sandbox Code Playgroud)