如何阻止openapi-generator-cli生成带完整命名空间的模型文件
openapi-generator-cli 生成模型去除命名空间解决方案
你可以通过以下两种常用方案实现需求,根据你的场景选择即可:
方案1:通过生成器附加参数配置(无需额外脚本)
运行生成命令时通过additional-properties传入modelNameMapping规则,批量把带命名空间的模型名映射为纯类名,同时自动生成对应文件名:
- 如果你的所有模型命名空间前缀固定,直接按如下格式写映射规则,把前缀替换为空即可,示例命令如下:
openapi-generator-cli generate \ -i 你的openapi规范文件地址(本地路径或url) \ -g 你用的typescript生成器(比如typescript-axios/typescript-fetch等) \ -o 输出目录 \ --additional-properties=modelNameMapping=MyNamespaceCommonV1ModelsDto*=*
上述配置会自动把所有MyNamespaceCommonV1ModelsDto开头的模型名截断,仅保留后面的类名部分,生成的文件名和代码里的接口名都会同步变成你期望的格式。
如果你的模型命名空间不固定,5.0以上版本的openapi-generator支持正则匹配规则,配置如下:
--additional-properties=modelNameMapping=/^.*([A-Z][a-zA-Z0-9]+)$/$1/
该正则会自动提取模型名末尾的纯类名部分,忽略前面所有命名空间前缀。
方案2:后处理脚本兜底(兼容性最强)
如果上述配置不生效,可在生成完成后运行一个简单的node脚本批量处理文件和内容,示例脚本如下:
const fs = require('fs'); const path = require('path'); // 替换为你的生成文件输出目录 const modelDir = './src/models'; fs.readdirSync(modelDir).forEach(file => { if (!file.endsWith('.ts')) return; // 提取纯类名的kebab-case格式 const pureNameKebab = file.split('-').slice(-1)[0].replace('.ts', ''); const newFileName = `${pureNameKebab}.ts`; const filePath = path.join(modelDir, file); const content = fs.readFileSync(filePath, 'utf8'); // 替换内容里的接口名 const pureClassName = pureNameKebab.replace(/-([a-z])/g, (_, c) => c.toUpperCase()); const newContent = content.replace(/export interface (\w+)/, `export interface ${pureClassName}`); // 写入新文件删除旧文件 fs.writeFileSync(path.join(modelDir, newFileName), newContent, 'utf8'); fs.unlinkSync(filePath); });
把上述脚本存为post-process.js,在生成命令后执行node post-process.js即可。
内容的提问来源于stack exchange,提问作者DaveDev
相关产品推荐
相关产品推荐

