【问题标题】:How to generate OpenAPI sources from gradle when building Android app构建 Android 应用程序时如何从 gradle 生成 OpenAPI 源
【发布时间】:2020-12-06 09:56:10
【问题描述】:

我正在努力实现的目标

我正在尝试使用 build.gradle 脚本中的 OpenAPI 生成器为 Android 生成我的 REST API 客户端。这样,每次规格更改时我都不必运行生成器命令行。理想情况下,这将在我构建/组装我的应用程序时生成,并且源将最终在 java (generated) 文件夹中,然后可以从代码访问生成的源(这就是发生的情况BuildConfig.java 文件)。

到目前为止我已经尝试过什么

link from their official GitHub 之后,这是我最终得到的 build.gradle 文件:

apply plugin: 'com.android.application'
apply plugin: 'org.openapi.generator'

...

openApiValidate {
    inputSpec = "$rootDir/app/src/main/openapi/my-api.yaml"
    recommend = true
}
openApiGenerate {
    generatorName = "java"
    inputSpec = "$rootDir/app/src/main/openapi/my-api.yaml"
    outputDir = "$buildDir/generated/openapi"
    groupId = "$project.group"
    id = "$project.name-openapi"
    version = "$project.version"
    apiPackage = "com.example.mypackage.api"
    invokerPackage = "com.example.mypackage.invoker"
    modelPackage = "com.example.mypackage.model"
    configOptions = [
        java8               : "true",
        dateLibrary         : "java8",
        library             : "retrofit2"
    ]
}
...

首先,我从未设法通过构建/组装任务生成 API,即使我尝试添加:

compileJava.dependsOn tasks.openApiGenerate

assemble.dependsOn tasks.openApiGenerate

我可以生成源的唯一方法是手动触发 openApiGenerate 任务:

然后,当我以这种方式生成源代码时,它们最终会出现在 build 文件夹中,但无法从我的代码中访问,并且在 java (generated) 文件夹中不可见:

然后我必须手动将生成的源文件复制/粘贴到我的项目源中才能使用 API。

即使我可以通过添加手动程序来解决这些问题,但如果整个过程都是自动的,那将更易于维护。我能够使用另一个工具 Protobuf 实现类似的结果。实际上,每次构建应用程序时都会触发我的 gradle 任务,并且源代码最终位于 java (generated) 文件夹中,因此我不必做任何额外的工作。不过这项任务要简单得多,所以我假设我无法使用 OpenAPI Generator 复制的主要工作由 Protobuf 插件本身处理。

【问题讨论】:

    标签: android gradle openapi openapi-generator


    【解决方案1】:

    您必须将生成源的路径指定为 Gradle 模块的自定义源集,在这种情况下为 app,如此处所述 – https://developer.android.com/studio/build/build-variants#configure-sourcesets。这样,Gradle 会将您的源代码视为可从您的代码访问。

    类似这样的:

    android {
      ...
      sourceSets {
        main {
          java.srcDirs = ['build/generated/openapi/src/main/java']
        }
      }
      ...
    }
    

    【讨论】:

      【解决方案2】:

      我解决了你这样描述的问题,但是我正在使用 gradle.kts。

      见我的build.gradle.kts

      plugins {
          // Your other plugins
          id("org.openapi.generator") version "5.3.0"
      }
      
      openApiGenerate {
          generatorName.set("kotlin")
          inputSpec.set("$rootDir/app/src/main/openapi/my-api.yaml")
          outputDir.set("$buildDir/generated/api")
          // Your other specification
      }
      
      application {
          // Your other code
          sourceSets {
              main {
                  java {
                      // TODO: Set this path according to what was generated for you
                      srcDir("$buildDir/generated/api/src/main/kotlin")  
                  }
              }
          }
      }
      
      tasks.compileKotlin {
          dependsOn(tasks.openApiGenerate)
      }
      

      您需要为 IDE 至少构建一次应用程序才能检测到库(至少 Intellij 中我就是这种情况)

      【讨论】:

        猜你喜欢
        • 2017-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 2017-07-18
        • 2015-06-17
        • 1970-01-01
        相关资源
        最近更新 更多