我该如何在我的Xcode项目的podfile中指定多个目标?

170

我在我的Xcode 4项目中使用了CocoaPods,并为我的项目拥有三个目标(默认的一个,一个用于构建精简版和一个用于构建演示版)。所有目标都使用相同的库,但是CocoaPods仅向主目标添加静态库和搜索路径。我的podfile看起来像这样:

platform :ios, '5.0'

pod 'TestFlightSDK', '>= 1.1'
pod 'MBProgressHUD', '0.5'
pod 'iRate', '>= 1.6.2'
pod 'TimesSquare', '1.0.1'
pod 'AFNetworking', '1.1.0'
pod 'KKPasscodeLock', '0.1.5'
pod 'iCarousel', '1.7.4'

我唯一能让它工作的方法是逐个指定每个目标,并再次列出所有的Pod。

platform :ios, '5.0'

target :default do  
    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :lite do 
    link_with 'app-lite'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :demo do 
    link_with 'app-demo'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

有更好的方法吗?


请阅读有关抽象目标的内容。这正是您所需要的。https://guides.cocoapods.org/syntax/podfile.html#abstract_target - Nike Kov
4个回答

411

自从 CocoaPods 1.0 改变了语法,不再使用 link_with,而是要做类似这样的操作:

# Note; name needs to be all lower-case.
def shared_pods
    pod 'SSKeychain', '~> 0.1.4'
    pod 'INAppStoreWindow', :head
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
    pod 'KSADNTwitterFormatter', '~> 0.1.0'
    pod 'MASShortcut', '~> 1.1'
    pod 'MagicalRecord', '2.1'
    pod 'MASPreferences', '~> 1.0'
end

target 'Sail' do
    shared_pods
end

target 'Sail-iOS' do
    shared_pods
end

旧答案: 在 CocoaPods 1.0 之前:

是的,有更好的方法!查看 link_with,你可以使用 link_with 'MyApp', 'MyOtherApp' 来指定多个目标。

我在单元测试中使用它,例如: link_with 'App','App-Tests' (注意目标名称中的空格)。

示例:

platform :osx, '10.8'

link_with 'Sail', 'Sail-Tests'

pod 'SSKeychain', '~> 0.1.4'
pod 'INAppStoreWindow', :head
pod 'AFNetworking', '1.1.0'
pod 'Reachability', '~> 3.1.0'
pod 'KSADNTwitterFormatter', '~> 0.1.0'
pod 'MASShortcut', '~> 1.1'
pod 'MagicalRecord', '2.1'
pod 'MASPreferences', '~> 1.0'

使用 abstract_target 方法:

在下面的示例中,'ShowsiOS''ShowsTV''ShowsTests'目标都有自己独立的库,以及继承了ShowsKit,因为它们都是虚拟目标'Shows'的子级。

# Note: There are no targets called "Shows" in any of this workspace's Xcode projects.
abstract_target 'Shows' do
  pod 'ShowsKit'

  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end

  # Our tests target has its own copy
  # of our testing frameworks
  # (beside inheriting ShowsKit pod).

  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end

更新了我的答案。这并不重要。 - Keith Smiley
4
我正在尝试做同样的事情,但在我的情况下,我链接到主目标的多个目标依赖项。这导致链接阶段出现重复符号错误。您知道如何使用Cocoapods解决这个问题吗? - Fergal Rooney
2
看起来你的目标列表周围的括号不再需要(也无法工作?)。详情请参考:http://guides.cocoapods.org/syntax/podfile.html#link_with - toblerpwn
@KeithSmiley能否详细说明一下“注意目标名称中的空格”?是只需正确书写并不忘记空格,还是要将空格替换为“-”,例如“App-Tests”? - hishamaus
2
@KeithSmiley 我明白了。实际上,我仍然在处理这些空格的问题。我不得不将所有目标重命名为没有空格的名称。很遗憾Cocoapods没有一个(对于所有目标)的选项而只有link_with。 - hishamaus
显示剩余9条评论

104

1
你介意解释一下为什么这是一个更好的解决方案吗? - Warpling
1
@Warpling:请看一下这篇文章http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/ - Adarsh G J
12
如果你在这里加入一点解释,那就太好了。(保持SO上所有必要信息是很好的,以防链接失效等)这也可能会帮助人们看到link_with的问题并点赞你的回答 :) - Warpling
我喜欢这种方法,因为它允许一堆 pod 对所有目标(available_pods)和特定目标的 pod 可用。 - Apoc
这个解决方案很好,但值得一提的是:你的“def”值必须是小写的。 - Jerome

15

如果您希望多个目标共享相同的Pod,请使用abstract_target。

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'
  pod 'Fabric'

  # Has its own copy of ShowsKit + ShowWebAuth
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # Has its own copy of ShowsKit + ShowTVAuth
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end
end

或者只是

pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
  pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
  pod 'ShowTVAuth'
end

来源:https://guides.cocoapods.org/using/the-podfile.html


1

最简单的方法是使用抽象目标,其中指定的每个 Pod 将与所有目标链接。

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

realTarget不应该放在someNameForAbstractTarget内部而不是外部吗? - Shubham Bakshi
从其他答案来看,这种方法也可能行得通。 - Shaked Sayag

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