Gradle Buildscript无法解析buildSrc中定义的对象

3
我已在Android Studio中创建了一个新项目,并将gradle buildscript转换为使用Kotlin dsl,代码如下:
build.gradle.kts(项目)
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath("com.android.tools.build:gradle:4.1.1")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.4.10")

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

tasks.register("clean", Delete::class) {
    delete(rootProject.buildDir)
}

build.gradle.kts(应用程序)

plugins {
    id("com.android.application")
    kotlin("android")
}

android {
    compileSdkVersion(30)
    buildToolsVersion = "30.0.2"

    defaultConfig {
        applicationId = "com.myproject"
        minSdkVersion(16)
        targetSdkVersion(30)
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        named("release").configure {
            isMinifyEnabled = false
            proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    implementation("org.jetbrains.kotlin:kotlin-stdlib:1.4.10")
    implementation( "androidx.core:core-ktx:1.3.2")
    implementation( "androidx.appcompat:appcompat:1.2.0")
    implementation( "com.google.android.material:material:1.2.1")
    implementation( "androidx.constraintlayout:constraintlayout:2.0.4")
    testImplementation( "junit:junit:4.+")
    androidTestImplementation( "androidx.test.ext:junit:1.1.2")
    androidTestImplementation( "androidx.test.espresso:espresso-core:3.3.0")
}

最后,build.gradle.kts(BuildSrc)。

import org.gradle.kotlin.dsl.`kotlin-dsl`

plugins {
    `kotlin-dsl`
}

repositories {
    jcenter()
}

dependencies {
    implementation(kotlin("script-runtime"))
}

这个项目能正常工作,并按预期构建。

现在,我希望将某些硬编码的版本号和名称提取为常量。例如,我想将这一行代码更改为: implementation("org.jetbrains.kotlin:${ProjectConfig.KOTLIN_VERSION}") 而不是 implementation("org.jetbrains.kotlin:kotlin-stdlib:1.4.10")

因此,我在 buildSrc/src/main/java/ProjectConfig.kt 中创建了一个新文件,内容如下:

object ProjectConfig {
    const val KOTLIN_VERSION:String = "1.4.10"
}

但当我试图从我的gradle脚本引用此对象并进行gradle同步时,我会收到以下错误消息:

e: E:\projects\MyProject\build.gradle.kts:11:58: 未解决的引用: ProjectConfig

如何正确定义可以从所有build.gradle文件中引用的对象?


可能是包的问题。为此文件创建包结构,在 ProjectConfig.kt 中定义包,然后在 build.gradle.kts 中导入对象。 - Ivan Shafran
@Ivan 它在模块 build.gradle.kts 中可用,但在项目 build.gradle.kts 中不可用。 - duggulous
好的,那么此时我不确定包的问题。也许可以将您的代码与示例中的代码进行比较:https://medium.com/swlh/gradles-kotlin-dsl-buildsrc-4434100a07d7 - Ivan Shafran
你能否发布你的buildSrc构建文件?看起来你还没有在其中添加kotlin-dsl插件。 - ckunder
已更新buildSrc/build.gradle.kts的内容。kotlin-dsl插件已经存在。 - duggulous
1个回答

3
以下是关于在根目录下的 build.gradle.kts 中类可用性情况的发现:
在根级别上:
- buildSrc 类:可用。 - 组合项目类:仅当您在 plugins {} 块中声明来自组合项目的插件时才可用。
在 "buildscript" 块中:
- buildSrc 类:可用。但如果该类位于包中,则必须使用完全限定的类名,例如 com.example.MyClass(不能使用 import)。 - 组合项目类:根本不可用。
这是使用 Gradle 7 确定出来的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接