簡體   English   中英

如何在我的 android gradle groovy dsl 構建文件中配置 ksp

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM