Kotlin多平台是构建多平台应用程序的一个很好的特性,但目前它(可能)被限制在Kotlin多平台生态系统中。我能否实现自定义构建逻辑来扩展expect
、actual
等的解析策略?或者说,将这些特性看作是多平台的一个一般概念,但是在构建过程中有不同的行为。欢迎分级工作。
例如,如果相关的扩展点可用,可以编写一个Kotlin编译器插件来解析这些expect
/actual
端点,并可能将它们组合到实际平台特定的运行时逻辑中,然后编写一个Gradle插件来最终处理这些工件。
因此,如果有两个“多平台”场景,它们都使用jvm作为“后端”,但提供了与“前端”相同或类似的逻辑的不同api,那么您可以像上面这样做来提供Kotlin Multiplatform所做的好处--编写一次,在任何地方运行。
我更愿意称之为“api层多平台”,以区别于Kotlin多平台是“系统层多平台”。“平台”可能是更抽象的平台。
这就是制作人所做的,就像Kotlin Multiplatform一样:
build.gradle.kts:
plugins {
kotlin("jvm")
id("<multiplatform-plugin-id>") // Comes with Kotlin compiler plugin too
}
dependencies {
api("<common-dependency-notation>") // Another multiplatform library
}
common
模块:
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
模块:
actual fun hookOnStart(block: () -> Unit) { // Imaginary
ClientEvents.START.register(block)
}
anotherPlatform
模块:
actual fun hookOnStart(block: () -> Unit) { // Imaginary
val event = EventFactory.once(ClientStartEvent::class.java, block)
GlobalEventHandler.register(event)
}
如前所述,在构建之后,每个平台都将有自己的工件准备运行时或作为库提供。他从另一个多平台库中获益,因为他可以通过共享代码为每个平台提供相同的功能。
以下是消费者所做的事情:(假设他在platform
上)
build.gradle.kts
plugins {
kotlin("jvm")
}
dependencies {
implementation("<previous-common-dependency-notation>") // From the previous author, mapped to `platform` version
}
商业逻辑:
fun runBussiness() {
hello()
hookOnStart { serviceLogger.info("world!") }
}
发布于 2022-03-29 06:33:03
这是非常未知的领域,没有任何文件。
我会更深入地研究kotlin-多平台级插件的源代码,看看是否可以扩展现有的目标调色板并期望/实际行为。
我猜想这个插件并不是为这种扩展而构建的,但是如果您有充分的理由,您可能会提交特性请求并在此期间处理本地分叉。
更新:,如果我正确理解了您的用例,您希望扩展expect/actual
机制,它目前是一个基于目标/平台的抽象?我相信一种更通用的抽象方式,比如使用interface
,可以为您服务。但是,我可以看到您所寻求的额外编译时安全好处,不确定需要在kotlin-multiplatform
插件中进行哪些更改,以及JetBrains团队是否希望这样做。也许Artyom Degtyarev或者JetBrains团队的人能回答什么?
https://stackoverflow.com/questions/71655291
复制相似问题