在同一工作区中使用iOS框架和App项目中的Cocoapods

时间:2017-07-24 20:29:59

标签: ios xcode git frameworks cocoapods

好吧,也许我做了一件绝对错误的事情,所以请随意纠正我。让我解释一下我想要实现的目标。

我在一个有多个目标的项目上工作。每个目标用于创建单独的应用程序。目标共享许多核心功能,但是一些目标添加一些额外的代码或者仅使用"核心"的最小集合(例如一些web服务)。

目前,所有内容都打包在一个Xcode项目中,我使用的是" Target Membership"功能(在文件检查器中)标记哪个类属于哪个目标。核心类是所有目标的成员,特殊类只是一个目标的成员。

这很容易让人感到困惑,它带来了另一个问题。我想使用CI / CD服务器自动构建和发布Test Flight的更新。由于目前所有文件都在一个存储库中,因此无法自动检测需要更新的应用程序。

我现在的计划是将我的存储库和我的项目分成多个部分。我想过使用一个" Core"项目以及每个应用程序的一个项目。每个项目都将驻留在它自己的GIT存储库中。

然后我创建一个"主人"存储库并使用GIT子树添加其他存储库。然后,我可以分别为每个存储库设置触发器以构建相应的应用程序(如果我在核心中更改某些内容,则可以立即创建所有应用程序)。

到目前为止结构看起来不错,但是我正确地设置了cocoapods有问题。我的问题是我在我的核心中使用cocoapod依赖项,现在它是一个框架。我的Podfile目前看起来像这样:

source 'https://github.com/CocoaPods/Specs.git'
workspace 'Master.xcworkspace'

platform :ios, '10.0'
use_frameworks!

project 'core/Core'
project 'app/MyApp'

def common_pods
    pod 'Firebase/Core'
    pod 'Alamofire'
end

target 'Core' do
  project 'core/Core'
  common_pods  

  target 'CoreTests' do
    inherit! :search_paths
  end
end

target 'MyApp' do
  project 'app/MyApp'
end

我的文件系统看起来像这样:

  • 主人(文件夹)
    • Master.xcworkspace
    • Podfile
    • 核心(文件夹)
      • Core.xcproject
      • 核心(包含文件的文件夹)
    • app(文件夹)
      • MyApp.xcproject
      • MyApp(包含文件的文件夹)

如果我现在在其中一个MyApp类中导入Core框架,我会收到一个构建错误,说“"缺少必需的模块' Firebase'"如果我添加" common_pods"对于MyApp目标,我可以构建但在运行时获得一堆"类xxx在Core.framework和/.../MyApp.app/MyApp中实现。将使用两者之一。哪一个未定义。"错误和我的应用程序崩溃。

我曾经读过,应该制作自定义框架pod并使用cocoapods添加它们,而不是通过项目目标嵌入二进制功能直接添加它们,但这并不意味着每次我对核心进行更改时,我需要构建框架,然后在最终构建和运行我的应用程序之前进行pod更新?这不是解决方案。

我错过了什么?我究竟做错了什么?我希望你能帮我搞清楚。

1 个答案:

答案 0 :(得分:3)

在将我的应用分成框架时,我遇到了类似的问题。每个单独的目标必须包含它自己使用的pod的副本。目标之间不共享窗格。 http://samwize.com/2015/01/26/projects-workspace-embedded-framework-and-cocoapods/

common_pods添加到' MyApp'你试过为我工作的podfile中的目标,这让我相信你的问题可能是你的框架项目被添加到你的工作区。我按照这里的说明进行操作:http://www.splinter.com.au/2016/11/22/scalable-swift/

我的理解是您正在寻找的行为,其中链接到Core框架也将链接到Core框架的pod依赖项,只有当您将Core框架置于其自己的pod中时才有可能 - 但正如你所指出的那样,这样做会产生相当大的开销。

希望有一天Swift Package Manager让这更容易:)