简体   繁体   中英

Unresolved reference: sourceSets for Gradle Kotlin DSL

Trying to migrate my existing build.gradle to Kotlin and I am getting the following error in my project:

Script compilation error:

  Line 86:         from(sourceSets["main"].allSource)
                        ^ Unresolved reference: sourceSets

1 error

The error is coming from my subprojects block when I try to define the sourcesJar task:

subprojects {
    val sourcesJar by tasks.registering(Jar::class) {
        classifier = "sources"
        from(sourceSets["main"].allSource) // error here
    }

    configure<PublishingExtension> {
        publications {
            register("mavenJava", MavenPublication::class) {
                from(components["java"])
                artifact(sourcesJar.get())
            }
        }
    }

    val implementation by configurations
    val compileOnly by configurations
    val annotationProcessor by configurations

    dependencies {
        implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion")
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
        implementation("org.jetbrains.kotlin:kotlin-reflect")
        compileOnly("org.springframework.boot:spring-boot-autoconfigure")
        // ...
    }
}

I'm using the following:

  • Gradle 4.10.2
  • Kotlin 1.2.70

Beginning part of the build.gradle.kts before subprojects block:

import com.diffplug.gradle.spotless.KotlinExtension
import com.diffplug.gradle.spotless.SpotlessExtension
import io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

val kotlinVersion: String by extra
val springBootVersion: String by extra

buildscript {
    val kotlinVersion: String by extra { "1.2.70" }
    val springBootVersion: String by extra { "2.0.6.RELEASE" }
    repositories {
        maven {
            val nexusPublicRepoURL: String by project
            url = uri(nexusPublicRepoURL)
        }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:$springBootVersion")
        classpath("com.diffplug.spotless:spotless-plugin-gradle:3.9.0")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
        classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion")
        classpath("org.jetbrains.kotlin:kotlin-compiler-embeddable:1.2.70")
    }
}

allprojects {
    val projectGroup: String by project
    group = projectGroup

    apply(plugin = "kotlin")
    apply(plugin = "java-library")
    apply(plugin = "maven-publish")
    apply(plugin = "kotlin-spring")
    apply(plugin = "com.diffplug.gradle.spotless")
    apply(plugin = "io.spring.dependency-management")

    configure<DependencyManagementExtension> {
        imports {
            mavenBom("org.springframework.boot:spring-boot-dependencies:$springBootVersion")
            mavenBom("org.springframework.cloud:spring-cloud-dependencies:Finchley.SR1")
        }
    }

    repositories {
        maven {
            val nexusPublicRepoURL: String by project
            url  = uri(nexusPublicRepoURL)
        }
    }

    tasks.existing(KotlinCompile::class) {
        kotlinOptions {
            freeCompilerArgs = listOf("-Xjsr305=strict")
            jvmTarget = "1.8"
        }
    }

    configure<SpotlessExtension> {
        kotlin {
            ktlint()
        }
    }

    configure<PublishingExtension> {
        repositories {
            maven {
                val nexusReleaseRepoURL: String by project
                val nexusSnapshotRepoURL: String by project
                val nexusUsername: String by project
                val nexusPassword: String by project
                val version = if ((project.version as String).contains("SNAPSHOT")) nexusReleaseRepoURL else nexusSnapshotRepoURL
                url = uri(version)
                credentials {
                    username = nexusUsername
                    password = nexusPassword
                }
            }
        }
    }
}

Since the plugin is applied imperatively in the same build script, Gradle can't know the plugin is applied and thus can't generate the extension functions allowing to access the source sets.

So you need to get the source set programmatically:

project.the<SourceSetContainer>()["main"]

Don't use

the<SourceSetContainer>()["main"]

otherwise the the() function will be resolved on the current task being configured instead of the project.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM