Как сгенерировать источники OpenAPI из gradle при создании приложения для Android

Чего я пытаюсь достичь

Я пытаюсь создать свой клиент REST API для Android с помощью генератора OpenAPI из сценария build.gradle. Таким образом, мне не пришлось бы запускать командную строку генератора каждый раз, когда меняются спецификации. В идеале это должно быть сгенерировано, когда я создаю / собираю свое приложение, и исходники должны попадать в папку java (сгенерированный), где сгенерированные источники затем доступны из кода (это то, что происходит с файл BuildConfig.java, например).

Что я пробовал до сих пор

Следуя этой ссылке со своего официального 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

or

assemble.dependsOn tasks.openApiGenerate

Единственный способ, которым я мог сгенерировать источники, - это вручную запустить задачу openApiGenerate:

введите описание изображения здесь

Затем, когда я создаю свои источники таким образом, они попадают в папку сборки, но недоступны из моего кода и не отображаются в папке java (сгенерированный):

введите описание изображения здесь

Затем мне нужно вручную скопировать / вставить сгенерированные исходные файлы в источники моего проекта, чтобы использовать API.

Несмотря на то, что я могу обойти эти проблемы, добавив ручные процедуры, было бы намного легче поддерживать, если бы весь процесс был просто автоматическим. Мне удалось добиться аналогичного результата с другим инструментом, Protobuf. Действительно, моя задача gradle запускается каждый раз, когда я создаю приложение, а источники попадают в папку java (generated), поэтому мне не нужно выполнять дополнительную работу. Однако задача намного проще, поэтому я предполагаю, что основная работа, которую я не могу воспроизвести с помощью OpenAPI Generator, выполняется самим плагином Protobuf.


person Paul-Etienne    schedule 17.08.2020    source источник


Ответы (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']
    }
  }
  ...
}
person Даниил Борисовский    schedule 05.05.2021