Gradle OpenAPI Generator选择性生成异常:指定API与Model后缺失基础设施文件夹导致构建失败
问题描述
我在使用Gradle OpenAPI Generator任务生成客户端代码时,遇到了一个棘手的问题:当不指定apis和models参数时,生成的输出里会包含infrastructure文件夹,里面存放着客户端构建必需的所有共享/通用文件。但一旦我指定了要生成的特定apis和models,这个infrastructure文件夹就不再生成了,直接导致构建完全无法进行!
以下是我的任务配置代码:
task buildMyClient(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){ generatorName = "kotlin" inputSpec = "$rootDir/openapi/specs/myservice.yaml".toString() outputDir = "$buildDir/generated".toString() apiPackage = "com.mycompany.myservice" packageName = "com.mycompany.myservice" modelPackage = "com.mycompany.myservice.model" globalProperties = [ apis: "MyController", models: "MyApiRequest,MyApiResponse,EmbeddedApiResponse" ] configOptions = [ "enumPropertyNaming": "UPPERCASE" ] }
我是不是需要手动指定所有支持文件?有没有办法在保留默认配置的同时只生成指定的apis和models?
解决方案
这个问题其实是OpenAPI Generator的默认行为导致的:当你显式指定apis或models参数时,生成器会默认只生成你指定的这些组件,自动跳过所有通用的基础设施文件。不过我们只需要添加一个简单的配置就能解决这个问题——在globalProperties里补充supportingFiles参数,让生成器继续生成那些必需的共享文件。
方案1:显式列举需要的支持文件
你可以先查看Kotlin生成器默认生成的支持文件列表,再把它们添加到配置中。对于Kotlin客户端来说,通常必需的支持文件包括:
ApiClient.ktApiException.ktConfiguration.ktPair.ktProgressRequestBody.ktProgressResponseBody.ktStringUtils.kt
修改后的任务配置如下:
task buildMyClient(type: org.openapitools.generator.gradle.plugin.tasks.GenerateTask){ generatorName = "kotlin" inputSpec = "$rootDir/openapi/specs/myservice.yaml".toString() outputDir = "$buildDir/generated".toString() apiPackage = "com.mycompany.myservice" packageName = "com.mycompany.myservice" modelPackage = "com.mycompany.myservice.model" globalProperties = [ apis: "MyController", models: "MyApiRequest,MyApiResponse,EmbeddedApiResponse", // 添加这行,指定要生成的支持文件 supportingFiles: "ApiClient.kt,ApiException.kt,Configuration.kt,Pair.kt,ProgressRequestBody.kt,ProgressResponseBody.kt,StringUtils.kt" ] configOptions = [ "enumPropertyNaming": "UPPERCASE" ] }
方案2:一键生成所有默认支持文件
如果你不想手动列举每个文件,也可以直接用supportingFiles=all让生成器保留所有默认的共享文件:
globalProperties = [ apis: "MyController", models: "MyApiRequest,MyApiResponse,EmbeddedApiResponse", supportingFiles: "all" ]
这样配置后,生成器就会在生成你指定的apis和models的同时,自动创建infrastructure文件夹以及里面的所有必需文件,构建也就可以正常进行了。
另外小提示:如果你不确定哪些支持文件是必需的,可以先运行一次不指定apis和models的任务,查看生成的infrastructure文件夹里的文件列表,再把这些文件名添加到supportingFiles参数中即可。
内容的提问来源于stack exchange,提问作者TheJeff

