yeoman生成器中使用fs.copyTpl批量复制ejs模板时如何自动移除.ejs扩展名
问题排查与实现方案
为什么你遇到的现象不触发自动去.ejs逻辑
- 内置的自动移除.ejs扩展名的逻辑,仅在源参数传入glob匹配规则、解析出文件列表时生效。你之前直接把
ejs/目录路径作为源传入,mem-fs-editor会走「整目录原样复制」的分支,这个分支只会完全保留源文件的文件名结构,不会执行任何后缀处理。 - 你之前尝试修改glob为
ejs/**.*没生效,一方面是glob写法不规范,没有明确指向.ejs文件;另一方面你对copyTpl的参数顺序认知有误:copyTpl的参数顺序是「源路径/glob → 目标路径 → 模板上下文 → 配置项」,你既没把收集到的this.props作为模板上下文传入,也把processDestinationPath这类配置放错了位置,导致配置根本没被读取,自然不会触发回调。 - 你之前的代码哪怕路径正确,模板里的变量也无法正常渲染,因为没有传入对应的上下文。
可直接复用的正确代码
调整writing方法的实现如下即可:
writing() { // 传入之前收集的用户输入作为模板渲染上下文 const context = this.props; // 源路径使用glob匹配规则,覆盖ejs目录下所有层级的.ejs文件 const sourceGlob = this.templatePath('ejs/**/*.ejs'); this.fs.copyTpl( sourceGlob, this.destinationPath('out'), context, { // 兜底的路径处理逻辑,强制移除.ejs后缀,不受内置逻辑版本影响 processDestinationPath: (filePath) => filePath.replace(/\.ejs$/, '') } ); }
常见场景适配
- 如果模板目录下同时有需要渲染的.ejs文件和不需要处理的静态文件(图片、纯静态文本等),可以把源glob调整为
ejs/**/*,搭配上面的processDestinationPath逻辑即可:非.ejs文件会原样保留文件名复制,.ejs文件会自动去掉后缀后渲染。 - 目录层级会自动保留:比如模板目录下的
ejs/api/config.json.ejs,会自动输出到out/api/config.json路径下,不需要手动处理嵌套路径。
内容的提问来源于stack exchange,提问作者s-hoff
相关产品推荐
相关产品推荐

