KSP Setup

检查 gradle 版本

把 gradle build script 改成 KTS 之後,我们可以先确认一下现有的 project gradle 的版本,最好是要有 gradle 7 以上的版本。在 project 根目录的地方找到 gradle/wrapper/gradle-wrapper.properties 里面的 distributionUrl 确认版本号。

Screen Shot 2021-09-21 at 10.50.01 AM.png

加 JVM plugin

接着,到 :annotation 的 module 底下的 build.gradle.kts 加入 JVM plugin :

plugins {
    kotlin("jvm")
    // 略
}

:processor 的 module 也要加 JVM plugin 和 KSP 的 dependency :

plugins {
		kotlin("jvm")
		// 略
}

dependencies {
		implementation("com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0")
		// 略
}

加完了 plugin 和 dependency 就要在使用 annotation 和 annotation processor 的地方,加上 KSP 的 plugin 和 dependency ,要加的 module 应该有 :processorTest ,如果你有其他地方也有做测试或是用到 processor 都要加。

plugins {
    id("com.google.devtools.ksp") version "1.5.30-1.0.0"
		// 略
}

dependencies {
		ksp(project(":processor"))
		// 略
}

settings.gradle.kts 那边,加上 KSP plugin management 的宣告和指定 project 要拉的 repository 。

pluginManagement {
    plugins {
        id("com.google.devtools.ksp") version "1.5.30-1.0.0"
        kotlin("jvm") version "1.5.30"
    }
    repositories {
        gradlePluginPortal()
        google()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

include(":kotlin", ":testCommon", ":processorTest", ":processor", ":annotation", ":android", ":app")
rootProject.name = "KtRssReader"

如果你有决心要把 KAPT 都改掉的话,要把 KAPT 的 dependencies 都删乾净。都改完了之後,记得要先 sync 一次 gradle 的 build !

创建新的 processor

:processor module 底下建立新的 processor

class KspProcessor(
    private val codeGenerator: CodeGenerator,
    private val logger: KSPLogger,
    private val options: Map<String, String>
): SymbolProcessor {
    override fun process(resolver: Resolver): List<KSAnnotated> {
        logger.info("[testksp]")
        val symbols = resolver
            .getSymbolsWithAnnotation("tw.ktrssreader.annotation.RssTag")
            .filterIsInstance<KSClassDeclaration>()
        symbols.forEach { logger.info("[testksp] ${it.simpleName.getShortName()}") }
        return emptyList()
    }
}

我们先把有标注 @RssTag 的 class 名称 log 出来。

然後在同一个 module 底下建立一个 processor provider

class KspProcessorProvider : SymbolProcessorProvider {

    override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
        return KspProcessor(
            codeGenerator = environment.codeGenerator,
            logger = environment.logger,
            options = environment.options
        )
    }
}

最後一个步骤,要在 processor/src/main/resources/META_INF/servies 底下增加一个名为 com.google.devtools.ksp.processing.SymbolProcessorProvider 的档案 (路径跟之前使用的 AutoService 同路径),档案内容如下:

com.google.devtools.ksp.processing.SymbolProcessorProvider

Screen Shot 2021-09-21 at 11.21.28 AM.png

上述步骤都完成之後,就可以 rebuild 一次 project 看看有什麽效果罗!如果没有意外应该可以看到 IDE build output 的 log 有我们在 KspProcessor 写的 log !

Screen Shot 2021-09-21 at 11.16.52 AM.png


<<:  Day17. 老鼠,老虎傻傻分不清楚?- Mouse(下)

>>:  Day 17 : 案例分享(5.3) CRM与ERP整合 - 商机与报价 及相关整合介绍

用React刻自己的投资Dashboard Day6 - 建立图表区元件,串接API取得数据

tags: 2021铁人赛 React 上一篇使用静态的资料,将多张数据资料表画成线图呈现在网页上,...

Day 30:Deploy To GitHub Pages

在我们辛苦开发完专案後,需要找一个网路空间,把我们的网站布署上去来提供服务,因此这篇我们将使用Git...

Day07 NAT 类型

NAT 网路位址转换(英语:Network Address Translation,缩写:NAT)是...

DAY 11 Big Data 5Vs – Velocity(多样性)

另一个常见资料库分类是从「资料处理*」的应用角度来区分: 交易型Transaction: OLTP:...

CMoney第八届菁英软件工程师战斗营_Week 3

时间静悄悄的来到第三周 本周让我开始觉得撞墙期开始了 周一的手写考卷就考得不如意 被考试手写与上机...