将同一框架链接到CocoaPods中的多个目标

时间:2019-05-22 20:31:32

标签: swift cocoapods

我有一个Swift项目,其中包含一些与主应用程序链接的本地框架。其中一个框架需要CocoaPod,而主项目在其他地方也需要。显然我只想要一份。这似乎工作正常,但是单元测试变得混乱。这是Podfile的略微简化版本:

platform :ios, '11.0'
inhibit_all_warnings!
use_frameworks!

# The main app target
target 'TheApp' do
  pod 'Instabug'

  target 'TheAppTests' do
    inherit! :search_paths
    pod 'OHHTTPStubs/Swift'
  end
end

# A framework target that's linked by TheApp
target 'Logging' do
  pod 'Instabug'

  target 'LoggingTests' do
    inherit! :search_paths
  end
end

我认为我应该将测试目标嵌套在其主题中。 TheApp导入Logging。两者都导入InstabugTheAppTests的主机应用程序为TheAppLoggingTests没有托管应用程序。

我以预期的方式得到了Pods-TheAppPods-TheAppTestsPods-Logging。有时我得到Pods-LoggingTests,有时我得到Pods-Logging-LoggingTests。 (事实证明,这与继承设置有关。如果未设置,则得到Pods-Logging-LoggingTests;如果将其设置为search_paths,则得到Pods-LoggingTests。)

我经常收到错误消息,Instabug未复制到LoggingTest捆绑软件中,或者我收到错误消息,Instabug已被处理两次。该应用程序本身似乎运行良好。只是单元测试失败。 (还有其他几个本地框架,它们没有任何依赖关系,我也没有在Podfile中列出它们。)

请注意,所有框架目标都位于一个xcodeproj中。

我怀疑我只是在错误地编写Podfile。是否有规范的方式来处理具有自己的测试和与应用程序相匹配的依赖关系的本地(非Pod)框架?

这是CocoaPods 1.7.0。我在1.6.2。中遇到了同样的问题。

2 个答案:

答案 0 :(得分:1)

您可以创建实际目标继承的抽象目标,从而具有2组依赖关系,其中一些是共享的。

这就是我的工作

project "NSScreencast/NSScreencast.xcodeproj"
use_frameworks!

abstract_target "NSScreencast-Base" do
  pod "Kingfisher"
  pod "R.swift"

  target "NSScreencast" do
    platform :ios, "11.0"
    pod "AppCenter"
    pod "FXReachability"
    pod "Colorkit"
    pod "SVProgressHUD"
    pod "1PasswordExtension"
    pod "OneSignal", ">= 2.6.2", "< 3.0"
    pod "Reveal-SDK", :configurations => ["Debug", "Debug-LocalServer"]
  end

  target "OneSignalNotificationServiceExtension" do
    platform :ios, "11.0"
    pod "OneSignal", ">= 2.6.2", "< 3.0"
  end

  target "NSScreencastTV" do
    platform :tvos, "10.0"
  end
end

这使我可以在多个目标(这里是iOS和tvOS)中使用共享的pod,并且每个目标也都有特定的pod。

这可以解决您的问题吗?

答案 1 :(得分:0)

我遇到了同样的问题,我个人发现以线性方式管理吊舱和创建用于引用每个吊舱的辅助方法要容易得多。这样,当您在项目之间共享Pod时,只能在一个地方更新Pod版本:

platform :ios, '11.0'
inhibit_all_warnings!
use_frameworks!

##
## Group pods
##

def alamofire_pods
    pod 'Alamofire', ~> '4.0'
end

def snapkit_pods
    pod 'SnapKit', '~> 4.0'
end

#
# Now, lets create all subprojects and main project pod dependencies
#

target 'MySubproject' do
    project 'rel_path_to/subproject.xcodeproj'

    alamofire_pods

    target 'MySubproject Tests' do
        inherit! :complete
    end
end

# Following same pattern for all other subprojects

target 'MainProject' do
   project 'Mainproject.xcodeproj' # path to main project

   snapkit_pods
   alamofire_pods

   target 'Mainproject Unit Tests' do
   end
end

target 'Mainproject UI Tests' do
    # specific pods for your UI Test
end

这种方法效果最好,并有助于在项目中运行子项目测试。

经验法则,请务必确保从项目中删除旧的pod引用。这在我的案例中引起了问题,在构建我认为用于子项目的单元测试时引发了错误。 Cocoapods不会从项目的构建阶段清除旧的pod目标引用。

注意,如果您在pod install中未进行任何更改,则podfile不应更改广告连播目标名称。