Попытка включить swagger-codegen с gradle kotlindsl

Я пытаюсь заставить swagger codegen работать в проекте, созданном с помощью gradle (kotlin).

Я ссылаюсь на этот пример здесь: https://github.com/int128/gradle-swagger-generator-plugin, выполненный в версии Gradle groovy.

Теперь build.gradle.kts выглядит следующим образом:

repositories {
    jcenter()
}

plugins {
    java
    id("org.springframework.boot") version "2.1.2.RELEASE"
    id("io.spring.dependency-management") version "1.0.6.RELEASE"
    id("org.hidetake.swagger.generator") version "2.16.0"
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation ("io.swagger:swagger-annotations:1.5.21")
    swaggerCodeGen("io.swagger:swagger-codegen-cli:2.3.1")

    // Use JUnit test framework
    testImplementation ("junit:junit:4.12")
}

swaggerSources {
    petstore {
        inputFile = file('petstore.yaml')
        code {
            language = 'spring'
        }
    }
}

Но IntelliJ не любит строки, говорящие о чванстве:

Ошибка IntelliJ

Я новичок в Gradle, поэтому я не понимаю, что я должен делать. Должен ли swaggerCodeGen быть функцией? Где эта функция должна быть импортирована? Куда swaggerSources предполагается ввозить?


person Clemzd    schedule 17.01.2019    source источник
comment
Вы также можете попробовать подключаемый модуль OpenAPI Generator gradle: github.com/OpenAPITools/openapi-generator/tree/master/modules/   -  person William Cheng    schedule 18.01.2019


Ответы (2)


import org.hidetake.gradle.swagger.generator.GenerateSwaggerCode

// plugins, repositories are same, but note import above ^^^

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation ("io.swagger:swagger-annotations:1.5.21")
    "swaggerCodegen"("io.swagger:swagger-codegen-cli:2.3.1") // 1

    // Use JUnit test framework
    testImplementation ("junit:junit:4.12")
}

swaggerSources {
    create("petstore").apply { // 2
        setInputFile(file("petstore.yaml")) // 3
        code(closureOf<GenerateSwaggerCode> { // 4
            language = "spring"
        })
    }
}

1 - динамически разрешаемая конфигурация в Kotlin выглядит так (динамически из Groovy, поэтому использовать ее во время компиляции проблематично, оператор вызова расширения на String - наш спаситель);

2 - swaggerSources возвращает вам NamedDomainObjectContainer<SwaggerSource>, поэтому для добавления нового контейнера мы вызываем create с его именем в качестве параметра;

3 - Kotlin не такой гибкий, как Groovy, поэтому вместо установки поля вызывается сеттер;

4 - Замыкание Groovy далеко от функционального интерфейса, поэтому указываем универсальный тип, т.к. в исходниках плагина Closure не параметризуется.

person kr3v    schedule 17.01.2019
comment
Мне нужна была задача swaggerSources. Я столкнулся с проблемой в code(closureOf...). Спасибо! - person ordonezalex; 14.03.2019

Вы также можете использовать эту задачу подключаемого модуля openapi-generator для создания кода swagger. Он делает то же самое, что и плагин swagger codegen. Используйте его в своем build.gradle.kts например:

plugins {
    id("org.openapi.generator") version "5.1.1"
}

openApiGenerate {
    generatorName.set("spring")
    inputSpec.set("$rootDir/src/main/resources/petstore.yaml")
    outputDir.set("$buildDir/generated/")
}

dependencies {
    //Spring boot dependency
    implementation("org.springframework.boot:spring-boot-starter-web")

    // For swagger generated code and annotations
    implementation("io.springfox:springfox-boot-starter:3.0.0") 
    implementation("javax.validation:validation-api:2.0.0.Final")
}

Это можно использовать с проектом kotlin или java, тогда вам нужно добавить сгенерированные классы в свой исходный набор, выполнив:

configure<SourceSetContainer> {
    named("main") {
        java.srcDir("$buildDir/generated/src/main/java")
    }
}

Последний шаг — убедитесь, что вы сгенерировали файлы swagger перед компиляцией, для Kotlin добавьте это в свою задачу компиляции:

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
    dependsOn("openApiGenerate")
    kotlinOptions.jvmTarget = "11"
}

Вы можете проверить свойства генератора, чтобы настроить конфигурация сгенерированных файлов.

person Sylhare    schedule 05.07.2021