使用copyTpl复制整个文件夹时重命名单个文件名

Pio*_*rek 1 node.js yeoman yeoman-generator

我的yeoman生成器将文件从模板复制到目标路径:

this.fs.copyTpl(
            this.templatePath(),
            this.destinationPath(), {
                appName: this.props.appName
            });
Run Code Online (Sandbox Code Playgroud)

在项目生成期间,我需要将值分配this.props.appName给某些文件名。

不幸的是,我无法像在这些文件中那样进行处理:

<%=appName%>-project.sln
Run Code Online (Sandbox Code Playgroud)

所有需要重命名的文件都具有appTemplate其名称,所以我要做的只是将其替换appTemplatethis.props.appName

我可以以某种方式配置copyTpl重命名某些文件,同时将它们复制到另一个目标位置吗?

Pio*_*rek 6

好的,我找到了解决方案。根据yeoman docs

任何生成器作者都可以注册transformStream来修改文件路径和/或内容。

使用此方法:

this.registerTransformStream();
Run Code Online (Sandbox Code Playgroud)

这意味着我可以通过一些脚本通过管道传输所有生成的文件:

var rename = require("gulp-rename");
//other dependecies...

module.exports = yeoman.Base.extend({

    //some other things generator do...

    writing: function() {
        var THAT = this;
        this.registerTransformStream(rename(function(path) {
            path.basename = path.basename.replace(/(666replacethat666)/g, THAT.props.appName);
            path.dirname = path.dirname.replace(/(666replacethat666)/g, THAT.props.appName);
        }));
        this.fs.copyTpl(
            this.templatePath(),
            this.destinationPath(), {
                appName: this.props.appName
            });
    }
});
Run Code Online (Sandbox Code Playgroud)

该脚本将通过gulp-rename传递所有文件,从而更改666replacethat666为更智能的文件。

  • lastest gulp-rename 对我不起作用,但仅适用于 1.2.2 版。- 从这里得到提示:https://github.com/yeoman/yo/issues/577#issuecomment-392325341 (2认同)