试图在gradle kotlindsl中包含swagger-codegen

时间:2019-01-17 10:23:02

标签: gradle kotlin swagger

我正在尝试使swagger code-gen在使用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不喜欢谈论摇摇欲坠的台词 enter image description here

我是gradle的新手,所以我不知道该怎么办。 swaggerCodeGen应该是一个函数吗?此功能应该导入哪里? swaggerSources应该导入哪里?

2 个答案:

答案 0 :(得分: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上的扩展invoke运算符是我们的救星);

2-{{​​1}}返回swaggerSources,因此要添加新容器,我们将其名称作为参数调用NamedDomainObjectContainer<SwaggerSource>

3-Kotlin不像Groovy那样灵活,因此调用setter而不是设置字段;

4-Groovy的闭包距离功能接口很远,因此我们将泛型类型指定为插件的源create中未设置参数。

答案 1 :(得分:0)

您也可以使用此 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")
}

这可以与 kotlinjava 项目一起使用,然后您需要通过执行以下操作将生成的类添加到您的 sourceSet:

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"
}

您可以检查生成器的 properties 以调整生成文件的配置。