将Pods与所有目标整合

21

我现在使用CocoaPods几周了,它与我测试的一个目标(我们称之为“MainApp”)完美地配合工作。然而,我现在想要构建一个不同的目标(“MyAppLite”),并且注意到构建失败(其中一个库的头文件未找到)。

我注意到Build Settings中的区别如下:

  • 在MyAppLite中,Other Linker Flags未包含所需的框架
  • 在MyAppLite中,Framework/Header/Library Search Paths都为空
  • 在MyAppLite中没有任何MainApp中的用户定义的Build Settings

我该如何确保当我运行pod install时,所有目标都链接了库?

以下是我的Podfile供参考:

platform :ios, '5.0'

pod 'TTTAttributedLabel', '~> 1.7.0'
pod 'iRate', '~> 1.7.5'
pod 'MBProgressHUD', '~> 0.6'
pod 'FlurrySDK', '~> 4.2.3'
pod 'ACSimpleKeychain', '~> 0.0.1'
pod 'WEPopover', '~> 0.0.1'
pod 'AFNetworking', '~> 1.3.1'
pod 'Nimbus', '~> 1.0.0'
pod 'QuincyKit', '~> 2.1.9'
4个回答

42

对于 CocoaPods 1.0.0,开发人员的建议是使用 abstract_target(但不兼容 0.39.0):

对于 CocoaPods 1.0.0 版本,建议开发者使用 abstract_target (但与 0.39.0 不兼容):

platform :ios, '5.0'

abstract_target 'defaults' do
    pod 'TTTAttributedLabel', '~> 1.7.0'
    pod 'iRate', '~> 1.7.5'
    pod 'MBProgressHUD', '~> 0.6'
    pod 'FlurrySDK', '~> 4.2.3'
    pod 'ACSimpleKeychain', '~> 0.0.1'
    pod 'WEPopover', '~> 0.0.1'
    pod 'AFNetworking', '~> 1.3.1'
    pod 'Nimbus', '~> 1.0.0'
    pod 'QuincyKit', '~> 2.1.9'

    target 'MyApp'
    target 'MyAppLite'
end

为了与 CocoaPods 0.39.0 + 1.0.0 版本兼容,使用 def 可以正常工作(但开发人员并不建议使用):

platform :ios, '5.0'

def default_pods
    pod 'TTTAttributedLabel', '~> 1.7.0'
    pod 'iRate', '~> 1.7.5'
    pod 'MBProgressHUD', '~> 0.6'
    pod 'FlurrySDK', '~> 4.2.3'
    pod 'ACSimpleKeychain', '~> 0.0.1'
    pod 'WEPopover', '~> 0.0.1'
    pod 'AFNetworking', '~> 1.3.1'
    pod 'Nimbus', '~> 1.0.0'
    pod 'QuincyKit', '~> 2.1.9'
end

target 'MyApp' do
    default_pods
end

target 'MyAppLite' do
    default_pods
end

21

使用 CocoaPods 1.x

您可以使用 target

platform :ios, '13.0'


def default_pods
    pod 'TTTAttributedLabel', '~> 1.7.0'
    pod 'iRate', '~> 1.7.5'
    pod 'MBProgressHUD', '~> 0.6'
    pod 'FlurrySDK', '~> 4.2.3'
    pod 'ACSimpleKeychain', '~> 0.0.1'
    pod 'WEPopover', '~> 0.0.1'
    pod 'AFNetworking', '~> 1.3.1'
    pod 'Nimbus', '~> 1.0.0'
    pod 'QuincyKit', '~> 2.1.9'
end

target 'MyApp' do
  default_pods
end

target 'MyAppLite' do
  default_pods
end

相关的文档


2
这本质上就是我所做的,但我不得不定义一个显式目标,其中包含所有的 pods,然后在 pods 列表之前加上 link_with ['MyApp', 'MyAppLite'] 这一行。 - colincameron
我可以问一下为什么您不得不这样做吗? - Gabriele Petronella
是的,可能是一个无关的打字错误或其他什么问题。现在它运行得非常好。 - colincameron
请注意,从版本1.2.0开始,此方法已不再适用。[!] 无效的Podfile文件:[!] Podfile中的link_with规范现已不受支持,请改用目标块。 - adamF
这个答案对我有用。 - Vladyslav Panchenko

9

如果您有大量的目标并且不想每次都添加新目标,您可以使用此功能。

def common_pods

   pod 'TTTAttributedLabel', '~> 1.7.0'
   pod 'iRate', '~> 1.7.5'
   pod 'MBProgressHUD', '~> 0.6'
   pod 'FlurrySDK', '~> 4.2.3'
   pod 'ACSimpleKeychain', '~> 0.0.1'
   pod 'WEPopover', '~> 0.0.1'
   pod 'AFNetworking', '~> 1.3.1'
   pod 'Nimbus', '~> 1.0.0'
   pod 'QuincyKit', '~> 2.1.9'

end

project = Xcodeproj::Project.open “./<projectNameHere>.xcodeproj"

project.targets.each do |t|

target t.name do

    common_pods

end

嗨,它不工作了。它给出了错误:[!]无效的Podfile文件:语法错误,意外的输入,期望结束。 - Maulik

3

根据文档:

如果没有明确指定目标,则Pods目标将与项目中的第一个目标链接。

您可以使用link_with来链接其他目标。

如果需要为不同的目标设置不同的依赖项配置,请参阅CocoaPods文档中的多个目标


构建设置会在 pod install 自动设置 - 我不想手动干预应该正确自动生成的东西 - 这不是 CocoaPods 的全部意义吗? - colincameron
另外,我想为所有目标设置完全相同的依赖关系。 - colincameron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接