首页 > 解决方案 > gradle buildscript 无法解析 buildSrc 中定义的对象

问题描述

我在 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:kotlin-stdlib:1.4.10") 为: implementation("org.jetbrains.kotlin:${ProjectConfig.KOTLIN_VERSION}")

所以我创建了一个新文件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 文件中引用的对象的正确方法是什么?

标签: androidgradlegradle-kotlin-dsl

解决方案


以下是我在build.gradle.kts 中发现的关于类可用性的信息:

在根级别:

  • buildSrc 类:可用
  • 复合项目类:仅当您在 plugins {} 块中声明复合项目的插件时才可用。

在“buildscript”块中:

  • buildSrc 类:可用但如果类在包中,则必须使用完全限定的类名,例如 com.example.MyClass(不能使用导入)
  • 复合项目类:根本不可用

这是用Gradle 7确定的。


推荐阅读