gradle - 未解析的引用 : sourceSets for Gradle Kotlin DSL

标签 gradle gradle-kotlin-dsl

尝试将我现有的 build.gradle 迁移到 Kotlin,我的项目中出现以下错误:

Script compilation error:

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

1 error

当我尝试定义 subprojects 任务时,错误来自我的 sourcesJar 块:
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")
        // ...
    }
}

我正在使用以下内容:
  • Gradle 4.10.2
  • Kotlin 1.2.70
  • build.gradle.kts 块之前的 subprojects 的开始部分:
    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
                    }
                }
            }
        }
    }
    

    最佳答案

    由于插件在同一个构建脚本中强制应用,Gradle 无法知道插件已应用,因此无法生成允许访问源集的扩展函数。

    所以你需要以编程方式获取源集:

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

    不要使用
    the<SourceSetContainer>()["main"]
    

    否则 the() 函数将在当前配置的任务而不是项目上解析。

    关于gradle - 未解析的引用 : sourceSets for Gradle Kotlin DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975515/

    相关文章:

    gradle - 无法设置上下文根

    gradle - 为什么我无法使用 Gradle Kotlin DSL (5.0) 访问 build.gradle.kts 的 "plugins"部分中的项目属性?

    java - 使用 Kotlin Gradle DSL 向 Kotlin 项目添加集成测试

    android - 如何运行模块的测试以及我的应用程序测试

    eclipse - 需要一些帮助来导入和重建Github Java项目

    spring-boot - 使用Apache Jmeter Core时出现Stackoverflow错误

    kotlin - Gradle 单引号与双引号

    android - 错误 : "Unresolved reference: versionCode" in build. gradle.kts

    gradle - 在 Android Studio 的产品风格中使用 Crashlytics

    android - 当我尝试运行该应用时会崩溃但没有错误? (Android Studio)