如何正确导入 Kotlin Multiplatform 项目(构建时只需要 运行 任务)
How to properly import a Kotlin Multiplatform project (and only run tasks necessary when building)
当我使用 Kotlin 开发 android 应用程序时,是否可能没有所有 iOS (kotlin/Native) 任务 (cinterop + cocoapods) 运行已导入多平台项目?
我们目前的KMP项目(SharedLibrary)结构是:
SharedLibrary
- build.gradle.kts
- settings.gradle.kts
- ...
- shared
- build.gradle.kts
- commonMain
- androidMain (android library target)
- ...
我们有一个单独的 Android 项目 (SomeApp),具有以下设置来导入我们的共享库。
// settings.gradle.kts
include ":shared"
project(":shared").projectDir = file("../SharedLibrary/shared")
事情是......这是一个非常烦人的开发模式,特别是因为 iOS 工件(cinterop + cocoapods 等)每次发生变化时都会重建,即使我只关心 android图书馆神器。
我尝试过的事情:
- 我尝试切换到复合构建,但我收到有关 gradle 无法找到多平台插件的错误。
- 我正在考虑切换到本地 maven,但它肯定会减慢开发过程,所以我拒绝了。
这是我们设置的问题吗?还是这些任务只是相互依赖,没有办法绕过它?
您可以像这样从构建中排除 iOS 目标:
kotlin {
android()
// kotlin.native.cocoapods.target property passed by cocoapods build from Xcode
val shouldBuildIos = project.findProperty("kotlin.native.cocoapods.target") != null
if (shouldBuildIos) {
ios()
cocoapods {
// ...
}
}
sourceSets {
// ...
if (shouldBuildIos) {
val iosMain by getting {
libDependencies(
"ktor.client.engine.ios",
)
}
}
}
}
但在这种情况下,IDE 中不会有任何代码建议。还要小心,因为在这种情况下你的 podspec 将被删除。
如果您只处理 android 部分而其他开发人员正在处理 iOS 部分,您可以在 local.properties 中创建自己的 属性,并确保您不会推送删除 podspec 文件(或忽略它)
但是如果你是一个开发者,这不是一个好的选择。我也遇到过很长的 cocoapods 构建时间,因此决定将其从多平台模块中移出。
每次我需要它时,我都会在公共代码中创建一个接口,并传递一个实现它的实例或一个“生成器”函数(如果你不想创建一个对象,除非它需要)来自 iOS部分。
在 y iOS 部分看起来像这样:
featureProvider = FeatureProvider(
context: .init(
rootController: rootViewController,
application: application,
launchOptions: launchOptions
),
providerGenerator: { socialNetwork, context -> CredentialProvider in
switch socialNetwork {
case .facebook:
return FacebookProvider(context: context)
case .google:
return GoogleProvider(context: context)
default: fatalError()
}
}
)
只想从支持者的角度谈谈这个问题。
我发现这个 YouTrack 问题似乎相关:https://youtrack.jetbrains.com/issue/KT-43796。请检查这是否正确描述了您的问题,如果没有,请在此处发表评论。此外,这是获取问题状态更新的最佳位置。
当我使用 Kotlin 开发 android 应用程序时,是否可能没有所有 iOS (kotlin/Native) 任务 (cinterop + cocoapods) 运行已导入多平台项目?
我们目前的KMP项目(SharedLibrary)结构是:
SharedLibrary
- build.gradle.kts
- settings.gradle.kts
- ...
- shared
- build.gradle.kts
- commonMain
- androidMain (android library target)
- ...
我们有一个单独的 Android 项目 (SomeApp),具有以下设置来导入我们的共享库。
// settings.gradle.kts
include ":shared"
project(":shared").projectDir = file("../SharedLibrary/shared")
事情是......这是一个非常烦人的开发模式,特别是因为 iOS 工件(cinterop + cocoapods 等)每次发生变化时都会重建,即使我只关心 android图书馆神器。
我尝试过的事情:
- 我尝试切换到复合构建,但我收到有关 gradle 无法找到多平台插件的错误。
- 我正在考虑切换到本地 maven,但它肯定会减慢开发过程,所以我拒绝了。
这是我们设置的问题吗?还是这些任务只是相互依赖,没有办法绕过它?
您可以像这样从构建中排除 iOS 目标:
kotlin {
android()
// kotlin.native.cocoapods.target property passed by cocoapods build from Xcode
val shouldBuildIos = project.findProperty("kotlin.native.cocoapods.target") != null
if (shouldBuildIos) {
ios()
cocoapods {
// ...
}
}
sourceSets {
// ...
if (shouldBuildIos) {
val iosMain by getting {
libDependencies(
"ktor.client.engine.ios",
)
}
}
}
}
但在这种情况下,IDE 中不会有任何代码建议。还要小心,因为在这种情况下你的 podspec 将被删除。
如果您只处理 android 部分而其他开发人员正在处理 iOS 部分,您可以在 local.properties 中创建自己的 属性,并确保您不会推送删除 podspec 文件(或忽略它)
但是如果你是一个开发者,这不是一个好的选择。我也遇到过很长的 cocoapods 构建时间,因此决定将其从多平台模块中移出。
每次我需要它时,我都会在公共代码中创建一个接口,并传递一个实现它的实例或一个“生成器”函数(如果你不想创建一个对象,除非它需要)来自 iOS部分。
在 y iOS 部分看起来像这样:
featureProvider = FeatureProvider(
context: .init(
rootController: rootViewController,
application: application,
launchOptions: launchOptions
),
providerGenerator: { socialNetwork, context -> CredentialProvider in
switch socialNetwork {
case .facebook:
return FacebookProvider(context: context)
case .google:
return GoogleProvider(context: context)
default: fatalError()
}
}
)
只想从支持者的角度谈谈这个问题。
我发现这个 YouTrack 问题似乎相关:https://youtrack.jetbrains.com/issue/KT-43796。请检查这是否正确描述了您的问题,如果没有,请在此处发表评论。此外,这是获取问题状态更新的最佳位置。