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

11

我正在开发一个自定义生成器,最初是使用 grunt-init 编写的。我注意到 grunt-init 会自动将根目录下的所有文件处理为模板,但是在 yeoman 生成器中,你需要使用 .template() 方法来实现这一点。我知道如何使用 .template() 处理单个文件,但是是否可以处理整个目录?

3个回答

12

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

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

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

6
这将批量复制一个目录中的所有文件到另一个目录,不使用模板文件。 - floatdrop
1
至少在Yeoman的最新版本中,这是通过应用模板和冲突检查来实现的(还有另一个名为bulkDirectory的函数可避免两者)。不幸的是,我找不到一种方法来避免模板处理但保留冲突检查。请注意,如果源与目标相同,则可以跳过它:this.directory('scripts').. 从源代码中学到的:http://yeoman.github.io/generator/actions.js.html - Diego
@Diego,您提供的链接失效了。您能提供一个新的链接吗? - SKuijers
2
@SKuijers np,看起来Yeoman最近更新了文档站点,新链接:http://yeoman.github.io/generator/lib_actions_actions.js.html - Diego

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

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}
        );
},

如果您使用的是全局模式,则目标路径应为文件夹。


我已经尝试过最新版本的Yeoman,按照这个方式进行操作,无论“project”文件夹是否存在,都没有复制任何内容。我甚至扩展了全局匹配模式为'./**/*',以尝试复制任何文件,但是无论文件深度、文件名或扩展名如何,都无法成功。似乎全局匹配根本就没有起作用。 - Artif3x
这在当前的Yeoman版本中对我有效,谢谢。 测试人员需要创建myFolder并放置文件才能工作。 - Alberto Souza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接