是否可以创建引用公共模块正确目标的 kotlin 多平台项目?
Is it possible to create a kotlin multiplatform project referencing the correct target of a common module?
如果我们想用 Kotlin 构建一个多平台项目并且我们有这样一个结构:
common
android
android1
android2
backend
api1
api2
在 common
模块中我们有 3 个目标/预设:
jvm
(所有基于 jvm 的项目都有通用代码)
jvmAndroid
(所有 jvm android 项目的通用代码,取决于 jvm)
jvmApi
(所有 jvm api 项目的通用代码,取决于 jvm)
我们如何正确配置我们的 build.gradle
s 文件以仅依赖于正确的预设/目标?
例如,如果我们想在我们的其他项目中使用公共模块作为依赖项,我们需要使用类似的东西:
dependencies {
implementation project(':common')
}
但是,是否可以只使用公共模块的正确部分?像这样(android 1 和 2)?
dependencies {
implementation project(':common:jvmAndroid')
}
否则,当我们使用 implementation project(':common')
时,这将获得所有 jvm 预设/目标,但一些代码只会在正确的平台上有意义或工作(在这种情况下 android 或 api ).
我们可以使用一种称为消除目标歧义的策略来实现这一目标。
https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#disambiguating-targets
我们需要做类似的事情:
val commonAttribute = Attribute.of("com.example", String::class.java)
jvm {
attributes.attribute(commonAttribute, "nameOfYourTarget")
}
在"client"和"server"这边。同理。
如果我们想用 Kotlin 构建一个多平台项目并且我们有这样一个结构:
common
android
android1
android2
backend
api1
api2
在 common
模块中我们有 3 个目标/预设:
jvm
(所有基于 jvm 的项目都有通用代码)jvmAndroid
(所有 jvm android 项目的通用代码,取决于 jvm)jvmApi
(所有 jvm api 项目的通用代码,取决于 jvm)
我们如何正确配置我们的 build.gradle
s 文件以仅依赖于正确的预设/目标?
例如,如果我们想在我们的其他项目中使用公共模块作为依赖项,我们需要使用类似的东西:
dependencies {
implementation project(':common')
}
但是,是否可以只使用公共模块的正确部分?像这样(android 1 和 2)?
dependencies {
implementation project(':common:jvmAndroid')
}
否则,当我们使用 implementation project(':common')
时,这将获得所有 jvm 预设/目标,但一些代码只会在正确的平台上有意义或工作(在这种情况下 android 或 api ).
我们可以使用一种称为消除目标歧义的策略来实现这一目标。
https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#disambiguating-targets
我们需要做类似的事情:
val commonAttribute = Attribute.of("com.example", String::class.java)
jvm {
attributes.attribute(commonAttribute, "nameOfYourTarget")
}
在"client"和"server"这边。同理。