![](/img/trans.png)
[英]How to Migrate build.gradle from Groovy to Kotlin DSL in Android Studio Bumblebee?
[英]how to configure ksp in my android gradle groovy dsl build files
我正在調查我當前 android 項目中的 io.arrow.kt 函數式編程庫。
我在配置使用 ksp 生成源代碼的光學模塊時遇到困難
我的項目gradle
類似於這個
buildscript {
ext.kotlin_version = "1.6.10"
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.40.5'
}
}
allprojects {
repositories {
google()
mavenCentral()
gradlePluginPortal()
maven { url 'https://jitpack.io' }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
與我的 android 子模塊類似
plugins {
id "com.android.library"
id "com.google.devtools.ksp" version "1.6.10-1.0.2"
id "kotlin-android"
id "kotlin-kapt"
id 'org.jetbrains.kotlin.plugin.serialization' version '1.4.20'
id 'dagger.hilt.android.plugin'
}
android {
compileSdkVersion 32
defaultConfig {
minSdkVersion 26
targetSdkVersion 32
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
consumerProguardFiles "consumer-rules.pro"
...
dependencies {
api(platform("io.arrow-kt:arrow-stack:1.0.6-alpha.1"))
api("io.arrow-kt:arrow-core")
api("io.arrow-kt:arrow-fx-coroutines")
api("io.arrow-kt:arrow-fx-stm")
api("io.arrow-kt:arrow-optics")
api "com.google.devtools.ksp:symbol-processing-api:1.6.10-1.0.2"
ksp "io.arrow-kt:arrow-optics-ksp-plugin:1.0.6-alpha.1"
我的 android kotlin 代碼中的光學代碼無法編譯
import arrow.optics.dsl.*
import arrow.optics.Optional
import arrow.optics.optics
@optics
data class Street(val number: Int, val name: String) {
companion object
}
@optics
data class Address(val city: String, val street: Street) {
companion object
}
@optics
data class Company(val name: String, val address: Address) {
companion object
}
@optics
data class Employee(val name: String, val company: Company?) {
companion object
}
fun what() {
val john = Employee("John Doe", Company("Kategory", Address("Functional city", Street(42, "lambda street"))))
//
// val optional: Optional<Employee, String> = Employee.company.address.street.name
//
// optional.modify(john, String::toUpperCase)
}
因為在注釋掉的代碼中找不到公司
ksp 在 android 上工作嗎? 我在 gradle 構建文件中犯了什么錯誤?
我找到的解決方案是降級箭頭 gradle deps 如下所示
implementation(platform("io.arrow-kt:arrow-stack:1.0.3-alpha.1"))
api("io.arrow-kt:arrow-core")
api("io.arrow-kt:arrow-fx-coroutines")
api("io.arrow-kt:arrow-fx-stm")
api 'io.arrow-kt:arrow-optics'
api "com.google.devtools.ksp:symbol-processing-api:1.6.10-1.0.2"
我還得補充
sourceSets {
main {
java {
srcDir "${buildDir.absolutePath}/generated/ksp/"
}
}
}
盡管@Hector 的解決方案有效,但它有一個缺點。 如果您有多種風格,則在構建變體之間切換時,您必須使用生成的 ksp 類清理目錄,因為它們會發生沖突並破壞程序集。 下面的代碼片段解決了這樣的問題。
android {
// ...
androidComponents.onVariants { variant ->
val name = variant.name
sourceSets {
getByName(name).kotlin.srcDir("${buildDir.absolutePath}/generated/ksp/${name}/kotlin")
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.