1

当我使用导入的 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,但它肯定会减慢开发过程,所以我反对。

这是我们设置的问题吗?还是这些任务只是相互依赖而没有办法解决?

4

2 回答 2

2

您可以像这样从构建中排除 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()
        }
    }
)
于 2021-04-29T06:05:55.703 回答
2

只想站在支持者的角度说一说这个问题。

我发现了这个似乎相关的 YouTrack 问题:https ://youtrack.jetbrains.com/issue/KT-43796 。请检查这是否正确描述了您的问题,如果没有,请在此处发表评论。此外,这是获取问题状态更新的最佳位置。

于 2021-04-29T09:21:56.560 回答