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

时间:2016-08-31 10:50:45

标签: node.js yeoman yeoman-generator

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

this.fs.copyTpl(
            this.templatePath(),
            this.destinationPath(), {
                appName: this.props.appName
            });

在项目生成期间,我需要为某些文件名指定this.props.appName的值。

不幸的是,我不能像我在这个文件中那样做:

<%=appName%>-project.sln

所有需要重命名的文件的名称都包含appTemplate,因此我需要做的只是将appTemplate替换为this.props.appName的值。

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

3 个答案:

答案 0 :(得分:4)

好的,我找到了解决方案。根据{{​​3}}:

  

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

使用此方法:

this.registerTransformStream();

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

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

此脚本将通过yeoman docs管道所有文件,将666replacethat666更改为更智能的内容。

答案 1 :(得分:0)

registerTransformStreamgulp-rename仍然是一个问题。但是,我可以在glob中使用它。

const glob = require('glob');

writing() {
    const files = glob.sync('**', { dot: true, nodir: true, cwd: this.templatePath() })
    for (let i in files) {
        this.fs.copyTpl(
            this.templatePath(files[i]),
            this.destinationPath( this.props.destinationFolderPath + '\\' + files[i].replace(/__fileName__/g,this.props.fileName)),
            this.props
        )
    }
}

答案 2 :(得分:0)

如果您因为使用 Yeoman 中的 registerTransformStream 功能(断开转换流注册)而无法使用 composeWith(),则可以使用 processDestinationPath,它在您选择多个文件时起作用(不是当您在第一个参数中指定特定文件时,出于某种原因)。

this.fs.copyTpl(
  this.templatePath("**/{.*,*}"),
  this.destinationPath(),
  { /* usually your prompt answers are here */ },
  {},
  {
    processDestinationPath: (filePath: string) =>
      filePath.replace(/somedir\/a-file.js/g, 'newdir/better-filename.js'),
  },
);

文档选项来源:https://yeoman.github.io/generator/actions_fs.html#.copyTemplate

基于 https://github.com/SBoudrias/mem-fs-editor#copyfrom-to-options-context-templateoptions-