首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用Kotlin多平台特性实现自定义平台逻辑?

如何利用Kotlin多平台特性实现自定义平台逻辑?
EN

Stack Overflow用户
提问于 2022-03-29 00:58:34
回答 1查看 196关注 0票数 0

Kotlin多平台是构建多平台应用程序的一个很好的特性,但目前它(可能)被限制在Kotlin多平台生态系统中。我能否实现自定义构建逻辑来扩展expectactual等的解析策略?或者说,将这些特性看作是多平台的一个一般概念,但是在构建过程中有不同的行为。欢迎分级工作。

例如,如果相关的扩展点可用,可以编写一个Kotlin编译器插件来解析这些expect/actual端点,并可能将它们组合到实际平台特定的运行时逻辑中,然后编写一个Gradle插件来最终处理这些工件。

因此,如果有两个“多平台”场景,它们都使用jvm作为“后端”,但提供了与“前端”相同或类似的逻辑的不同api,那么您可以像上面这样做来提供Kotlin Multiplatform所做的好处--编写一次,在任何地方运行。

我更愿意称之为“api层多平台”,以区别于Kotlin多平台是“系统层多平台”。“平台”可能是更抽象的平台。

这就是制作人所做的,就像Kotlin Multiplatform一样:

build.gradle.kts:

代码语言:javascript
运行
复制
plugins {
    kotlin("jvm")
    id("<multiplatform-plugin-id>") // Comes with Kotlin compiler plugin too
}

dependencies {
    api("<common-dependency-notation>") // Another multiplatform library
}

common模块:

代码语言:javascript
运行
复制
fun hello() {
    val logger = serviceLogger // Using api from that another multiplatform library
    logger.info("Hello")
}

expect fun hookOnStart(block: () -> Unit) // Needs to provide platform-specific implementations

platform模块:

代码语言:javascript
运行
复制
actual fun hookOnStart(block: () -> Unit) { // Imaginary
    ClientEvents.START.register(block)
}

anotherPlatform模块:

代码语言:javascript
运行
复制
actual fun hookOnStart(block: () -> Unit) { // Imaginary
    val event = EventFactory.once(ClientStartEvent::class.java, block)
    GlobalEventHandler.register(event)
}

如前所述,在构建之后,每个平台都将有自己的工件准备运行时或作为库提供。他从另一个多平台库中获益,因为他可以通过共享代码为每个平台提供相同的功能。

以下是消费者所做的事情:(假设他在platform上)

build.gradle.kts

代码语言:javascript
运行
复制
plugins {
    kotlin("jvm")
}

dependencies {
    implementation("<previous-common-dependency-notation>") // From the previous author, mapped to `platform` version
}

商业逻辑:

代码语言:javascript
运行
复制
fun runBussiness() {
    hello()
    hookOnStart { serviceLogger.info("world!") }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-29 06:33:03

这是非常未知的领域,没有任何文件。

我会更深入地研究kotlin-多平台级插件的源代码,看看是否可以扩展现有的目标调色板并期望/实际行为。

我猜想这个插件并不是为这种扩展而构建的,但是如果您有充分的理由,您可能会提交特性请求并在此期间处理本地分叉。

更新:,如果我正确理解了您的用例,您希望扩展expect/actual机制,它目前是一个基于目标/平台的抽象?我相信一种更通用的抽象方式,比如使用interface,可以为您服务。但是,我可以看到您所寻求的额外编译时安全好处,不确定需要在kotlin-multiplatform插件中进行哪些更改,以及JetBrains团队是否希望这样做。也许Artyom Degtyarev或者JetBrains团队的人能回答什么?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71655291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档