You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键调整说明

  1. 移除destination中的模板类型层级:原配置里destination包含{{projectType}},导致生成路径自动嵌套模板类型文件夹,直接去掉这部分即可将文件输出到项目根目录。
  2. 正确配置base属性:base用于指定模板文件的基准路径,设置为templates/{{projectType}}后,Plop会自动剥离这个前缀,将模板内的文件(包括子目录结构)直接输出到destination指定的目录下。
  3. 可选:隐藏文件支持:添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:24:04