Disable task for code-generation in test for google's KSP

490 Views Asked by At

I've a multi-module project using google's KSP version 1.8.10-1.0.9 and it would be helpful if someone can help me with disabling the task of code-generation in the tests sub-directory of the build directory.

This is roughly the structure of the project:

myProject
    - api
    - engine
    - methods
        - build.gradle.kts
            ```
            dependencies {
                implementation(project(":engine"))
                implementation(project(":methodsProcessor"))

                testImplementation(kotlin("test"))
                testImplementation(testFixtures(project(":engine")))

                testImplementation("org.junit.jupiter:junit-jupiter-params:5.8.2")

                ksp(project(":methodsProcessor"))
            }
        ```
        - build
            - generated
                - ksp
                    - main
                        - kotlin
                            - methods
                                - PublicMethods.kt

                    - test   ##  I don't want this directory to be created at all
                        - kotlin
                            - methods
                                - PublicMethods.kt
    - methodsProcessor
        - build.gradle.kts (contents below)
            ```
            dependencies {
                implementation(libs.ksp.api)
            }
            ```
        - src.main.kotlin.processor.MethodsProcessor
            ## this file has a SymbolProcessor which creates a new file (PublicMethods.kt) in
            ## `methods/build/generated/ksp/main/kotlin/methods` &
            ## `methods/build/generated/ksp/test/kotlin/methods` (THIS I would like not to be created)
    - build.gradle.kts
    - settings.gradle.kts
        ```
            rootProject.name = "myProject"

            include("engine")
            include("methods")
            include("api")
            include("methodsProcessor")

            val kotlinVersion: String by settings
            val kspVersion: String by settings

            pluginManagement {
                plugins {
                    // For some reason the global variables are not accessible here
                    val kotlinVersion: String by settings
                    val kspVersion: String by settings
                    kotlin("jvm") version kotlinVersion
                    kotlin("plugin.jpa") version kotlinVersion
                    kotlin("plugin.spring") version kotlinVersion
                    id("com.google.devtools.ksp") version kspVersion
                }
            }

            dependencyResolutionManagement {
                repositories {
                    mavenCentral()
                }
                versionCatalogs {
                    create("libs") {
                        library("ksp-api", "com.google.devtools.ksp:symbol-processing-api:$kspVersion")
                    }
                }
            }
            ```

When I run ./gradlew build for my project, the output on the terminal looks like:


> Task :api:openApiGenerate
################################################################################
# Thanks for using OpenAPI Generator.                                          #
# Please consider donation to help us maintain this project                  #
# https://opencollective.com/openapi_generator/donate                          #
################################################################################
Successfully generated code to /Users/gxyd/projects/solver-engine/api/build/generated-src/openapi

> Task :methods:kspKotlin
w: [ksp] hello world

Daemon will be stopped at the end of the build after running out of JVM memory

> Task :methods:kspTestKotlin
w: [ksp] hello world

So, the second task that you see, i.e. :methods:kspTestKotlin is something I don't to it to run.

I've already tried having the below configuration in methods.build.gradle.kts:

ksp {
    tasks.named("kspTestKotlin") {
        enabled = false
    }
}

which raises the error saying, there is no task named "kspTestKotlin", while building my project.

2

There are 2 best solutions below

0
On

By default, the ksp configuration applies to all source sets, while the other configurations (like kspTest) only apply to specific ones.

Starting from KSP 1.0.1, there is a property that allows you to enable this behavior for the ksp configuration as well. Simply add the following to your gradle.properties file:

ksp.allow.all.target.configuration=false

With this, the ksp configuration will only apply to the main source set. Starting from KSP 2.0, the ksp configuration will behave like this by default.

This is documented here: KSP with Kotlin Multiplatform

The documentation is for multiplatform, but this applies to single-platform projects as well.

0
On

I had similar issue, I was missing JUnit engine dependency:

testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junit}"