使用' vendored_frameworks'和' source_files' for cocoapod使用' use_frameworks!'

时间:2016-12-14 09:37:29

标签: ios swift frameworks cocoapods

我正在构建一个基本上包含框架(私有源)和依赖于此框架的视图(开源)的cocoapod,所有这些都是在Objective-C中完成的。

在podspec中,我有以下几行:

  • spec.vendored_frameworks =' MyPod / Framework / MyFramework.framework'
  • spec.source_files = [' MyPod / UI / Views / MyView。{h,m}']

使用use_frameworks!语法时,我无法#import MyFramework

我只是不明白发生了什么。

此外,当我移除spec.source_files行时,我可以#import MyFramework并且它可以完美运行,但当然我无法使用MyView

我做错了什么?

4 个答案:

答案 0 :(得分:1)

如果你使用use_frameworks!你的pod本身将成为一个框架。因此,您应该#import MyPod而不是#import MyFramework,然后使用MyView

如果您需要,请同时查看public_header_files

答案 1 :(得分:0)

由于项目的pod现在是一个框架,您可以使用 @import MyFramework尝试importing it as a module

但是,如果这不起作用,请尝试备份项目,然后运行pod deintegrate && pod install。此外,this question非常相似,其中一些评论和答案可能会有所帮助。

答案 2 :(得分:0)

对于今天遇到此问题的任何人:这是CocoaPods中的一个已知问题,在Github herehere上提出了一些讨论该问题的问题。

建议的解决方法是将您的podspec分为两个:一个仅使用vendored_frameworks的podspec,而另一个仅使用source_files的podspec使用该框架。

Github上的用户crsantos有一个{@ 3}的解决方法示例,下面是我复制的两个单独的podspec。

供应商提供的框架podspec:

# Regarding https://github.com/CocoaPods/CocoaPods/issues/6409
Pod::Spec.new do |s|
  s.name             = 'SampleDynamicLibPod'
  s.version          = '0.0.1'
  s.summary          = 'SampleDynamicLibPod. Cool Story bro!'

  s.description      = <<-DESC
Blah Blah Blah Blah Blah description
                       DESC

  s.homepage         = 'https://github.com/crsantos/SameRepoForAllPodSpecsAndSource'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'Carlos Santos' => 'mail@example.com' }
  s.source           = { :git => 'https://github.com/crsantos/SameRepoForAllPodSpecsAndSource.git', :tag => "#{s.name}-#{s.version.to_s}" }
  # this is the way of tagging diferent podspecs on the same repo
  # Dont't forget to tag your repo with `SampleDynamicLibPod-0.0.1` for this specific spec

  s.module_name      = 'SampleDynamicLibPod'

  s.ios.deployment_target = '9.0'
  s.platform = :ios, '9.0'
  s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3' }

  s.vendored_frameworks = 'SampleDynamicLibPod/Frameworks/SampleDynamicLib.framework'
end

源文件podspec。请注意对供应商框架podspec的依赖。

# Regarding https://github.com/CocoaPods/CocoaPods/issues/6409

Pod::Spec.new do |s|
  s.name             = 'WrapperAroundSampleDynamicLibPod'
  s.version          = '0.0.2' # just a different number to avoid confusion with the other podspec
  s.summary          = 'WrapperAroundSampleDynamicLibPod. Cool Story bro!'

  s.description      = <<-DESC
Wrapper Around Sample Dynamic Lib Pod Blah Blah Blah Blah Blah Blah Blah Blah
                       DESC

  s.homepage         = 'https://github.com/crsantos/SameRepoForAllPodSpecsAndSource'
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  s.author           = { 'Carlos Santos' => 'mail@example.com' }
  s.source           = { :git => 'https://github.com/crsantos/SameRepoForAllPodSpecsAndSource.git', :tag => "#{s.name}-#{s.version.to_s}" }

  # Dont't forget to tag your repo with `WrapperAroundSampleDynamicLibPod-0.0.2` for this specific spec

  s.module_name      = 'WrapperAroundSampleDynamicLibPod'

  s.ios.deployment_target = '9.0'
  s.platform = :ios, '9.0'
  s.pod_target_xcconfig = { 'SWIFT_VERSION' => '3' }

  s.source_files = 'WrapperAroundSampleDynamicLibPod/Classes/**/*'

  s.dependency 'CocoaLumberjack/Swift'
  s.dependency 'SampleDynamicLibPod', '0.0.1' # you can achieve this with "#{s.name}-#{s.version.to_s}" from the 
end

答案 3 :(得分:0)

从技术上来说,令人震惊的答案是正确的,但是有一种方法可以组合source_filesvendored_frameworks。解决方案是还使用preserve_paths指向供应商框架的位置。