我的自动生成器将文件从模板复制到目标路径:
this.fs.copyTpl(
this.templatePath(),
this.destinationPath(), {
appName: this.props.appName
});
在项目生成期间,我需要为某些文件名指定this.props.appName
的值。
不幸的是,我不能像我在这个文件中那样做:
<%=appName%>-project.sln
所有需要重命名的文件的名称都包含appTemplate
,因此我需要做的只是将appTemplate
替换为this.props.appName
的值。
我可以以某种方式配置copyTpl
重命名某些文件,同时将它们复制到另一个目的地吗?
答案 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)
registerTransformStream
与gulp-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-