在#NowInAndroid示例应用程序中,来自所包含模块的Kotlin文件NiaBuildType被导入到应用程序模块Build.gradle.kts文件中.

###build.gradle.kts (:app)

import com.google.samples.apps.nowinandroid.NiaBuildType

我试图达到几乎相同的结果,但每次我都得到了Unresolved reference: au个错误.

我在包含的版本中的包 struct 与我的应用程序模块相同,以启用可传递的依赖关系. 与NIA应用程序不同,我在子模块中没有约定插件(约定模块包括在构建逻辑模块中,而构建逻辑模块本身使用pluginmanager{}包含在项目中),并且只有一个包含buildplugin模块. 以下是我包含的模块buildplugin中的文件:

package au.com.myproject
object AppVersion {
    const val versionCode = 1
    const val versionName = "1.0"
}

以下是该项目的settings.gradle.kts个文件:

pluginManagement {
    includeBuild("buildplugin")
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

这是我的buildplugin模块build.gradle.kts文件:

plugins {
    `kotlin-dsl`
}

group = "au.com.myproject.buildplugin"

repositories {
    google()
    mavenCentral()
}

dependencies {
    compileOnly(gradleApi())

    implementation("com.android.tools.build:gradle:8.1.0")
    implementation(kotlin("gradle-plugin"))
}

这是我在应用程序模块build.gradle.kts中的用法:

import au.com.myproject.AppVersion

plugins {
    ...
}

android {
    namespace = "au.com.myproject"
    compileSdk = 34

    defaultConfig {
        applicationId = "au.com.myproject.pai"
        minSdk = 24
        //noinspection OldTargetApi
        targetSdk = 33
        versionCode = AppVersion.versionCode
        versionName = AppVersion.versionName

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

如果我使用buildSrc而不是复合构建,则可以毫无问题地导入对象.

我不确定我错过了什么,几天来我一直在用头撞墙,现在正在try 不同的方法.

推荐答案

我认为这里的诀窍是,如果插件不是buildSrc,则需要显式地定义和引用它.buildSrc的作用就像一个自动包含的插件.

(查看Now-in-Android中的app/build.gradle.kts,您将看到plugins模块中由build-logic模块注册的插件被拉入.)

如果没有buildSrc,我认为下面的方法应该有效.(它们类似于我在构建中定义的一个包含的插件)

  1. 在你的buildplugin/build.gradle.kts人中,添加

    // Copyright 2023 Google LLC.
    // SPDX-License-Identifier: Apache-2.0
    
    // at top
    plugins {
        `java-gradle-plugin`
    }
    
    ...
    
    gradlePlugin {
        plugins.register("buildplugin") {
            id = "buildplugin"
            implementationClass = "au.com.myproject.buildplugin.BuildPlugin"
        }
    }
    
  2. 如果你还没有BuildPlugin,那就创造一个吧.像这样的东西

    // Copyright 2023 Google LLC.
    // SPDX-License-Identifier: Apache-2.0
    class BuildPlugin: Plugin<Project> {
        override fun apply(project: Project) {
            // register tasks, create extensions if needed
        }
    }
    

    (我不确定您需要implementationClass和插件类,如果您不需要注册任务或创建扩展...)

  3. 您的settings.gradle.kts看起来不错;它包括构建期间的buildplugin,并使其对其他模块可见.

  4. 明确使用您的app/build.gradle.kts%中的插件

    // Copyright 2023 Google LLC.
    // SPDX-License-Identifier: Apache-2.0
    plugins {
        ...
        id("buildplugin")
    }
    

Android相关问答推荐

垂直居中图标

使用Kotlin的SD卡

如何禁用Android 34+版的TileService,但保留以前的版本?

无法将非静态方法与Frida挂钩

Jetpack Compose:带芯片的Textfield

在Android中使用Room从SQlite数据库中获取实体列表的正确方式是什么?

未解析的引用:视图模型

如何在Jetpack Compose中向SearchBar添加边框

Clean MVVM 架构中的 API 响应处理

如何在卡片视图右侧添加箭头

Android Drawable文件夹中的图像显示模糊

Android 应用程序从 Android Studio 安装,但不是作为 .apk 在外部安装.抛出java.lang.UnsatisfiedLinkError

NFC getNdefMessage 在 Android 13 上写入标签后返回 null

Electric Eel 后 Gradle 项目同步失败 | 2022.1.1更新

compose 导航参数字符串包含花括号?

我该怎么做文本计时器

为什么项目捕获对象给我在 Compose 中找不到参考

找不到(包名称).在以下位置搜索:

重命名列失败的房间自动迁移(NOT NULL 约束失败,生成错误的迁移类)

在alert 对话框生成器中启动协程