Search code examples
kotlingradleliquibasekotlin-multiplatform

How to use Gradle liquibaseRuntime configuration in a Kotlin/Multiplatform project


Currently, I'm porting my Spring Boot build.gradle.kts configuration to the Kotlin/MP stack. I don't know what to do with one part of the liquibaseRuntime configuration. The original config looks like:

// other dependencies omitted  
liquibaseRuntime("org.liquibase:liquibase-core")
liquibaseRuntime("org.liquibase.ext:liquibase-hibernate5:3.8")
liquibaseRuntime(sourceSets.getByName("main").compileClasspath)
liquibaseRuntime(sourceSets.getByName("main").output)
liquibaseRuntime("org.postgresql:postgresql")
liquibaseRuntime("org.springframework.boot:spring-boot:$springBootVersion")

Some part of this config possibly can be replaced with:

sourceSets {
    val jvmMain by getting {
        dependencies {
            configurations["liquibaseRuntime"].dependencies.addAll(listOf(
                DefaultExternalModuleDependency("org.liquibase", "liquibase-core", null, "default"),
                DefaultExternalModuleDependency("org.liquibase.ext", "liquibase-hibernate5", "3.8", "default"),
                DefaultExternalModuleDependency("org.postgresql", "postgresql", null, "default"),
                DefaultExternalModuleDependency("org.springframework.boot", "spring-boot", "2.2.4.RELEASE", "default")
    //          DefaultSelfResolvingDependency(configurations["compileClasspath"])
            ))

I've got stuck with these two and don't know what to do:

liquibaseRuntime(sourceSets.getByName("main").compileClasspath)
liquibaseRuntime(sourceSets.getByName("main").output)

They add instances of the dependency class DefaultSelfResolvingDependency (they also seem to be wrapped with some proxy). Looking through the liquibase-gradle plugin code didn't help.

So, how should I port these two dependencies?


Solution

  • Not familiar with with the Liquibase Gradle plugin. My assumption is you have applied the plugin in the following manner:

    plugins {
        id("org.liquibase.gradle") version "2.0.2"
    }
    

    Then you should be able to do what you have normally:

    dependencies {
        liquibaseRuntime("org.liquibase:liquibase-core")
        liquibaseRuntime("org.liquibase.ext:liquibase-hibernate5:3.8")
        liquibaseRuntime("org.postgresql:postgresql")
        liquibaseRuntime("org.springframework.boot:spring-boot:$springBootVersion")
    }
    

    If for some reason that didn't work out-of-the-box, then you need to help Gradle's Kotlin DSL by explicitly retrieving a reference of the configuration:

    val liquibaseRuntime by configurations
    
    dependencies {
        liquibaseRuntime("org.liquibase:liquibase-core")
        liquibaseRuntime("org.liquibase.ext:liquibase-hibernate5:3.8")
        liquibaseRuntime(sourceSets.getByName("main").compileClasspath)
        liquibaseRuntime(sourceSets.getByName("main").output)
        liquibaseRuntime("org.postgresql:postgresql")
        liquibaseRuntime("org.springframework.boot:spring-boot:$springBootVersion")
    }
    

    You could also do the following as well:

    dependencies {
        "liquibaseRuntime"("org.liquibase:liquibase-core")
        "liquibaseRuntime"("org.liquibase.ext:liquibase-hibernate5:3.8")
        // ...
    }
    

    Reference: Understanding what to do when type-safe model accessors are not available

    Now these two lines do not make sense to me.

    liquibaseRuntime(sourceSets.getByName("main").compileClasspath)
    liquibaseRuntime(sourceSets.getByName("main").output)
    

    According to the API documentation for DependencyHandler, there are certain allowed notations. A sourceSet is not one of them. So not sure what to do there.