Plop.js模板生成时如何移除目标路径中的project-type目录?
解决Plop.js v3.1.1生成文件时目标路径多出模板类型层级的问题
问题场景
使用Plop.js v3.1.1生成新包样板代码,配置了react、node、browser、isomorphic四个模板文件夹,用户通过命令行选择模板类型后,文件能正确识别生成,但最终路径会多出/project-type/层级(例如生成到packages/my-project/react/),期望直接将模板文件生成到packages/my-project/目录下,尝试过base和filter属性未解决。
原配置示例(存在路径问题)
module.exports = function (plop) { plop.setGenerator('new-package', { description: 'Generate a new package boilerplate', prompts: [ { type: 'input', name: 'projectName', message: 'Enter the package name:' }, { type: 'list', name: 'projectType', message: 'Select package type:', choices: ['react', 'node', 'browser', 'isomorphic'] } ], actions: [ { type: 'addMany', destination: 'packages/{{projectName}}/{{projectType}}/', templateFiles: 'templates/{{projectType}}/**/*', base: 'templates/{{projectType}}' } ] }); };
解决方案
核心是调整addMany的destination和base配置,剥离模板类型的路径层级:
修正后的Plopfile.js
module.exports = function (plop) { plop.setGenerator('new-package', { description: 'Generate a new package boilerplate', prompts: [ { type: 'input', name: 'projectName', message: 'Enter the package name:' }, { type: 'list', name: 'projectType', message: 'Select package type:', choices: ['react', 'node', 'browser', 'isomorphic'] } ], actions: [ { type: 'addMany', // 直接指向项目名称目录,移除{{projectType}}层级 destination: 'packages/{{projectName}}/', // 匹配对应模板类型下的所有文件 templateFiles: 'templates/{{projectType}}/**/*', // 设置base为模板类型的根目录,自动剥离templates/{{projectType}}路径前缀 base: 'templates/{{projectType}}', // 可选:确保.gitignore这类隐藏文件被匹配生成 globOptions: { dot: true } } ] }); };
关键调整说明
- 移除
destination中的模板类型层级:原配置里destination包含{{projectType}},导致生成路径自动嵌套模板类型文件夹,直接去掉这部分即可将文件输出到项目根目录。 - 正确配置
base属性:base用于指定模板文件的基准路径,设置为templates/{{projectType}}后,Plop会自动剥离这个前缀,将模板内的文件(包括子目录结构)直接输出到destination指定的目录下。 - 可选:隐藏文件支持:添加
globOptions: { dot: true }可以确保模板中的隐藏文件(如.gitignore、.npmrc)也能被正确匹配和生成。
备选方案(手动处理路径)
如果上述配置仍有问题,可以使用transformDestination函数手动处理生成路径:
actions: [ { type: 'addMany', templateFiles: 'templates/{{projectType}}/**/*', transformDestination: (destPath, _, data) => { // 从模板路径中剥离模板类型前缀,拼接项目名称路径 const relativeFilepath = destPath.replace(`templates/${data.projectType}/`, ''); return `packages/${data.projectName}/${relativeFilepath}`; }, globOptions: { dot: true } } ]
内容的提问来源于stack exchange,提问作者Sean McIntyre
相关产品推荐
相关产品推荐

