在 2 iOS 个应用程序之间共享通用代码:Swift 程序包管理器?椰足类?单体仓库?

Share common code between 2 iOS apps: Swift Package Manager? Cocoapods? Monorepo?

我即将开始开发两个新的 iOS 应用程序,它们将共享大量业务逻辑,例如整个 API 层和模型。我不想在两个项目中复制共享代码并试图保持同步,而是想使用某种方式来共享代码。

我的第一个想法是使用 Swift 包管理器。在 Xcode 中创建一个新包真的很容易,但我真的不知道如何在我处理它的同时在两个应用程序中使用共享包的本地版本,同时也让它适用于其他开发者(或 CI!)检查应用程序。不能真正提交具有本地路径依赖性的应用程序,因为那只对我有用,对吗?

那么,我可以在处理 2 个应用程序和那个核心包时使用该核心包的本地版本,但仍然将其全部推送到 GitHub 并在 CI 上编译吗对于其他开发者也是如此吗?或者它只能在我的机器上工作,因为它会引用本地路径?

将 Cocoapods 与私有 pod 一起使用会使事情变得更容易,还是我 运行 会遇到完全相同的问题,即在我的计算机上处​​理本地路径依赖性,但希望它也适用于其他开发人员?

或者我应该只使用包含应用程序和共享代码的 monorepo,让所有内容都使用相对路径? monorepo 内部的 SPM 包在这种情况下会有帮助,还是只在两个应用程序中使用相对路径?

我建议为您的业务逻辑创建一个(私有)cocoapod。您的两个应用程序都可以根据需要通过版本、存储库中的某处或作为开发 pod 引用该 cocoapod。

为了避免一直编辑 Podfile,您可以通过外部文件 and/or 环境变量来控制 pod 的源代码。这是我在几个项目中所做的:

def library_pod
  src = ENV["POD_SOURCE"]
  if src == nil && File.file?(".pod_source")
    src = File.foreach(".pod_source").first.chomp
  end
  src = (src || "").split(":")
  case src[0]
  when "dev"
    # local dev pod, editable
    pod 'MyLibrary', :path => '../mylibrary', :inhibit_warnings => false
  when "head"
    pod 'MyLibrary', :git => 'https://github.com/mycompany/MyLibrary'
  when "branch"
    pod 'MyLibrary', :git => 'https://github.com/mycompany/MyLibrary', :branch=> src[1]
  else
    # default: use the release version 
    pod 'MyLibrary'
  end
end

target 'MyApp' do
  pod 'Pod1'
  pod 'Pod2'
  library_pod
end

我的开发机器上的环境中通常有 POD_SOURCE=dev.pod_source 在 master 上包含 release,以及功能分支中合适的任何分支名称,这样我的 CI 就可以做对了。