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

Posted

技术标签:

【中文标题】如何在我的 podfile 中为我的 Xcode 项目指定多个目标?【英文标题】:How do I specify multiple targets in my podfile for my Xcode project? 【发布时间】:2013-02-01 03:02:11 【问题描述】:

我在我的 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

有没有更好的方法来做到这一点?

【问题讨论】:

请阅读抽象目标。这是你需要的。 guides.cocoapods.org/syntax/podfile.html#abstract_target 【参考方案1】:

由于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' 目标有自己独立的 pod,并继承了 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

【讨论】:

太好了,那么您会将 link_with 放在我的第一个示例 podfile 中的什么位置?你能给我举个例子吗? 更新了我的答案。应该没关系。 我正在尝试同样的事情,但就我而言,我正在链接到主目标的多个目标依赖项。这导致在链接阶段出现重复符号错误。你知道如何使用 Cocoapods 解决这个问题吗? 看起来您的目标列表周围的括号不再需要(并且不起作用?)。迪茨:guides.cocoapods.org/syntax/podfile.html#link_with @KeithSmiley 我明白了。实际上,我仍然在这些空间上遇到了麻烦。我不得不重命名我所有的目标以没有空格。糟糕的是 Cocoapods 没有(为所有目标都做)而不是 link_with。【参考方案2】:

我认为更好的解决方案是

# Podfile

platform :ios, '8.0'

use_frameworks!

# Available pods

def available_pods
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
end

target 'demo' do
  available_pods
end

target 'demoTests' do
    available_pods
end

参考来自:http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

【讨论】:

您介意解释一下为什么这是一个更好的解决方案吗? @Warpling:请通过这个natashatherobot.com/… 如果您在此处添加一些解释,那就太好了。 (最好保留 SO 上的所有必要信息,以防链接失效等)它还可以帮助人们看到 link_with 的问题并支持你的答案:) 我喜欢这种方法,因为它允许一堆 pod 可用于所有目标 (available_pods) 和目标特定 pod。 这个解决方案工作正常,但值得一提的是:你的'def'值必须是小写的。【参考方案3】:

如果您希望多个目标共享同一个 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

【讨论】:

【参考方案4】:

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

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

【讨论】:

不应该把realTarget放在里面 someNameForAbstractTarget而不是外面吗? 从其他答案来看,它也可以这样工作。

以上是关于如何在我的 podfile 中为我的 Xcode 项目指定多个目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 iphone 中为我的网站添加有效且受信任的安全证书?

如何在我的蛇游戏中为我的蛇的身体部位使用不同的图像? (Python、Pygame、Snake)

如何在我的 Docker 自托管 Jitsi 服务器中为我的 Android 应用程序实现 jwt 令牌韵律插件?

如何在我的可视 C# Web 服务中为我的 android 应用程序调用 LINQ 中的用户定义函数?

如何使用 Swift 2(Xcode 7)在我的 Sprite Kit 游戏中为背景音乐设置静音按钮?

我小时候在我的玩家类中为我的玩家制作了一个碰撞箱精灵。如何在游戏场景的 didBegin 方法中访问该碰撞箱精灵?