gpt4 book ai didi

gradle - 带有 Kotlin DSL 的 Android 子项目

转载 作者:行者123 更新时间:2023-12-04 23:35:50 25 4
gpt4 key购买 nike

我正在通过 Gradle 构建文件迁移到 Kotlin DSL,但遇到了一个问题。

在我的 parent build.gradle ,我有以下一段代码



buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Version.kotlin}"
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

subprojects {
afterEvaluate { project ->

if (project.plugins.findPlugin('com.android.application') ?:
project.plugins.findPlugin('com.android.library')) {

android {
compileSdkVersion = Android.SDK_COMPILE
defaultConfig {
minSdkVersion Android.SDK_MIN
targetSdkVersion Android.SDK_TARGET
versionCode = Android.VERSION_CODE
versionName = Android.VERSION_NAME
}
...
}
}
}
}


这允许我只在一个地方配置所有的 android 应用程序或库模块。

但是,当我迁移到 kotlin 时,这似乎不起作用:

buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath(Dependency.androidGradle)
classpath(Dependency.kotlinGradle)
}
}

allprojects {
repositories {
google()
mavenCentral()
}
}

subprojects {
afterEvaluate {

if (project.plugins.findPlugin("com.android.application") != null ||
project.plugins.findPlugin("com.android.library") != null) {

android { <<<<------------ Unresolved reference: android
compileSdkVersion(Android.SDK_COMPILE)
defaultConfig {
minSdkVersion(Android.SDK_MIN)
targetSdkVersion(Android.SDK_TARGET)
versionCode = Android.VERSION_CODE
versionName = Android.VERSION_NAME
}
...
}
}
}
}


错误是 Unresolved reference: android它看起来像 android{}脚本编译器无法识别 block 。

我的理论是 if检查子项目类型是不够的,我可能必须强制转换或获取对某个可以调用 android{} 的对象的引用 block ,但老实说我还不够了解。

有什么线索吗?

最佳答案

Gradle Kotlin DSL 从 gradle 类路径和应用的插件中确定每个脚本的依赖关系。这就是为什么它推荐使用 plugins { ... } Kotlin DSL 中的 block 。

您需要将 android 和 kotlin 插件添加到您的根目录而不应用它。

plugins {
id("<android-plugin>") version "<plugin-version>" apply false
id("<kotlin-plugin>") version "<plugin-version>" apply false
}

不幸的是,这仍然不会为根构建脚本生成静态访问器,但它会让您访问脚本中的插件类,您可以像这样引用它们:
subprojects {

// BasePlugin is the common superclass of the AppPlugin and LibraryPlugin which are the plugin classes that "com.android.application" and "com.android.library" apply
plugins.withType<BasePlugin> {

// BaseExtension is the common superclass of the AppExtension and LibraryExtension which are the extension classes registered by the two plugins to the name "android"
configure<BaseExtension> {

// This block is typed correctly
defaultConfig {
// ...
}
}
}
}

关于gradle - 带有 Kotlin DSL 的 Android 子项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57627119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com