当前位置: 首页 > 知识库问答 >
问题:

Gradle构建脚本无法解析构建Src中定义的对象

易俊远
2023-03-14

我在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(app)

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 \ my project \ build . grad le . kts:11:58:未解析的引用:ProjectConfig

定义可以从我的所有build.gradle文件中引用的对象的正确方法是什么?

共有1个答案

翁和正
2023-03-14

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

在根级别:

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

在“buildscript”块中:

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

这是用Gradle 7确定的。

 类似资料:
  • 主要内容:Gradle如何使用Groovy,Groovy的JDK方法,以下是纠正/补充内容:Gradle构建脚本文件用来处理两件事情:一个是项目和另一个的任务。每个生成表示一个或多个项目。一个项目表示一个JAR库或Web应用程序,也可能表示由其他项目产生的JAR文件组装的ZIP。简单地说,一个项目是由不同的任务组成。一个任务是指构建执行的一块工作。任务可能是编译一些类,创建一个,产生的或发布一些归档文件库。 注:Gradle使用Groovy语言编写脚本。 Gradle提供了一个域特定语言

  • 问题内容: 我有一个时髦的脚本去推广代码。长话短说,我知道该脚本中的某个时间点是否成功。如果不成功,我想使构建失败。有什么办法使构建失败? 例: 在“执行Groovy脚本”插件中。您可以编写代码。 其中,“ checkPromote”根据促销的状态返回true或false值。 问题答案: 我认为,中止程序的最优雅方法是声明。

  • Gradle 是以 Groovy 语言为基础, 基于DSL (领域特定语言) 语法的自动化构建工具,但是它增加了一些额外的特性,这使得Gradle更加的容易去阐释构建. 一个构建脚本能够包含任何Groovy语言的元素 ( Any language element except for statement labels ), 每个构建脚本都使用UTF-8编码.

  • 我知道这是一个专门用于Gradle构建脚本的DSL,但是我在哪里可以找到它,如何解析/使用它呢? 谢谢!

  • 本文向大家介绍gradle 分析构建,包括了gradle 分析构建的使用技巧和注意事项,需要的朋友参考一下 示例 在开始调整Gradle构建的性能之前,您应该建立基准并确定构建的哪些部分花费最多的时间。为此,您可以通过将--profile参数添加到Gradle命令来对构建进行概要分析: 构建完成后,您将在下./build/reports/profile/看到构建的HTML配置文件报告,如下所示:

  • Gradle 的构建脚本展示了 Groovy 的所有能力. 作为开胃菜, 来看看这个: 例子 6.4. 在 Gradle 任务里使用 Groovy build.gradle task upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: