【问题标题】:What is Cocoapods?什么是Cocoapods?
【发布时间】:2014-04-11 06:02:20
【问题描述】:

什么是Cocoapods?我看到很多开发人员在开发应用程序来安装 API 时一直在使用 Pods,但我不明白为什么不能手动导入文件。他们的目的是什么,他们有什么帮助?

【问题讨论】:

标签: xcode cocoapods dependency-management


【解决方案1】:

“CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖管理器。它拥有超过 30,000 个库,并用于超过 190 万个应用程序。CocoaPods 可以帮助您优雅地扩展您的项目。”通过http://cocoapods.org

从本质上讲,它可以帮助您将 3rd 方库、框架整合到您的产品中,而无需担心如何设置它们和配置您的项目,这有时可能是一个巨大的痛苦。

关于为什么不能只在项目中包含文件?

  • 由于这些是第 3 方,所以每次有新版本时您都必须下载并将它们复制到您的项目中?比方说,您的项目中有 10 个库或框架,现在想象一下您需要花时间检查其中是否有人有任何您想要更新的新版本?最糟糕的是,如果某些东西不起作用,您需要恢复到以前的版本吗?这确实需要时间而且很麻烦,使用CocoaPods,您只需输入pod update 并更新有可用新版本的版本。

  • 现在如果您想要某个特定库的 v1.1?浏览 Git 提交历史以找出你需要的提交历史有多容易?使用 CocoaPods,您只需说 pod 'AFrameworkLib', '1.1'

  • 每个库都需要使用一组特定的配置来设置您的项目以使其工作,为 10 个左右的库执行此操作然后修复冲突本身就是痛苦的。使用CocoaPods,它会自动处理。

  • 最后但并非最不重要的一点是,您必须包含您使用的所有第 3 方库的许可证,以便为该库的原始开发者提供信用。想象一下复制 10 个许可证文档并确保它们是最新的? CocoaPod 会自动在您的项目中创建一个确认文件,您可以简单地将其包含在适当的位置。

【讨论】:

  • 是否必须在适当(设置)的地方包含确认文件以供显示,还是可选的?请确认。
【解决方案2】:

来自https://cocoapods.org

CocoaPods 管理 Xcode 项目的库依赖项。

项目的依赖项在单个文本文件中指定 称为 Podfile。 CocoaPods 将解决之间的依赖关系 库,获取生成的源代码,然后将其链接在一起 用于构建项目的 Xcode 工作区。

最终目标是提高可发现性和参与度 在,第三方开源库通过创建一个更集中的 生态系统。

项目链接:link

规格(第三方工具):link

入门指南:link

【讨论】:

  • 好的。我的意思是说 cocoapods 对项目是强制性的吗?没有它我们可以创建项目吗?
  • 当然可以...... Cocoapods 只是让您轻松管理所有依赖项并使其保持最新状态。
  • 使用 cocoapods 会影响您将应用提交到 AppStore 的资格吗?例如因为使用了第三方 API?
  • @gbdavid 一些第三方 pod 使用 Apple 将拒绝的私有 API……在 podfile 中,您可以指定配置(调试和发布)和目标。例如,在我们的目标中使用具有私有 api 的特定 pod,但我们仅将其指定用于调试目的
【解决方案3】:

CocoaPods 是一个用于 Objective-C 项目的依赖管理工具,类似于 Maven 用于 Java 项目的依赖管理工具,它是用 Ruby 编写的,由多个 Ruby Gem 组成。这个想法是,一旦您将第三方库添加到您的项目中,您将不再需要检查是否有任何更新的版本。 CocoaPods 会为你处理这些。它还使返回到某个版本的库变得超级容易。要使用它,请按照以下步骤操作。更多详情可以在官网http://cocoapods.org找到

  1. 在您的 Mac 上运行以下命令

sudo gem 安装 cocoapods

  1. 在 cocoapods.org 中搜索所需的库,然后在 Xcode 项目目录中创建一个名为 Podfile 的文本文件,其中包含类似
  2. 的条目

   source 'https://github.com/CocoaPods/Specs.git'
   platform :ios, '8.0'

   pod 'AFNetworking'
   pod 'ARAnalytics', '~> 2.7'

对于每个库,您可以选择指定最低版本。

  1. 然后运行这些命令来启动项目目录中的所有必要组件
pod setup
pod install
open YourApp.xcworkspace

现在您的项目已准备就绪。注意上面的最后一个命令是打开 YourApp.xcworkspace,而不是 YourApp.xcodeproj,否则在构建应用时会出现“library not found -lPods”错误。

【讨论】:

    【解决方案4】:

    使用 cocoapods 或任何依赖管理器,您可以指定一个 framework 以及要使用的 version

    这样,团队的所有开发人员都安装了相同的版本。

    它的逻辑与 package.json + package-lock.jsonGemfile + Gemfile.lock 非常相似,您可以在其中列出所有 nodegem 依赖项。


    除了每个项目之外,语言对于是否提交依赖项的实际文件都有自己的约定,即所有项目都包含依赖项和版本列表。

    对于 iOS,在提交 pods 文件夹时有两种思路

    • 一个学派将您的 pods 目录视为派生数据。只要您在项目中检查了podfilelock 文件,并且您应该......那么理论上任何人都可以通过运行pod install 随时重新创建该环境。即你不需要提交 pods 项目 package.json 并为您下载依赖项。

    • 另一种观点认为,因为您的 pods 目录包含运行项目所需的基本文件……您绝对应该将其签入。这样任何人都可以下载您的整个存储库并运行它。无需其他步骤。这对于没有 Cocoapods 经验的新手开发人员来说更容易,因为项目的编译不需要您运行任何命令。尽管这种方法可能会导致您的存储库变得臃肿,并且您可能会遇到 pod 合并冲突。 Pod 合并冲突can be resolved as easily大多数 iOS 项目都是这样做的。

    上面这两个子弹主要来源于这个很棒的视频CocoaPods and Lockfiles

    还值得一提的是:

    Podfile.lock 位于根目录(以及 Podfile),因为需要将其提交到 git 中,这就是它们是例外的原因,而 Pods/ 中的任何内容都不需要提交工作(即使有些人出于缓存原因或其他原因),因为那里的所有内容都可以从Podfile 和 lockfile 中重新生成

    以上段落由Olivier Halligon撰写

    什么是Podfile

    它是每个目标的 pod 依赖项列表(例如,您的 Apple Watch 或测试目标可能具有与您的主 iOS 应用不同的依赖项)。作为开发人员,您列出了您的依赖项以及您想要的版本。例如在 Signals Podfile 中,想要使用 YapDatabase/SQLCipher pod,然后将其添加到 Podfile like this

    pod 'YapDatabase/SQLCipher', :git => 'https://github.com/signalapp/YapDatabase.git', branch: 'signal-release'
    

    什么是Podfile.lock

    它是您的 pod 依赖项以及 它们的依赖项 和 git url 以及它使用的 tag/version/commit 的快照。该文件是在您运行pod installpod update 时为您生成的。您不会自己对其进行更改。

    如果您已将 YapDatabase/SQLCipher 添加为 pod,则 Podfile.lock 将为您生成 these lines

    - YapDatabase/SQLCipher (3.1.1):
      - YapDatabase/SQLCipher/Core (= 3.1.1)
      - YapDatabase/SQLCipher/Extensions (= 3.1.1)
    

    锁是捕捉两个分支之间差异的好方法——假设它们都更新了相同的行。

    什么是podspec

    类似的东西。它有 pod 的名称、版本、主页、作者、来源、它需要拉入的源文件类型。

    Pod::Spec.new do |spec|
      spec.name         = 'Reachability'
      spec.version      = '3.1.0'
      spec.license      = { :type => 'BSD' }
      spec.homepage     = 'https://github.com/tonymillion/Reachability'
      spec.authors      = { 'Tony Million' => 'tonymillion@gmail.com' }
      spec.summary      = 'ARC and GCD Compatible Reachability Class for iOS and OS X.'
      spec.source       = { :git => 'https://github.com/tonymillion/Reachability.git', :tag => 'v3.1.0' }
      spec.source_files = 'Reachability.{h,m}'
      spec.framework    = 'SystemConfiguration'
    end
    

    podspecpodfile 之间的区别是什么?

    • podspec 定义了 pod 本身。 (由 pod 开发人员维护)
    • podfile 列出项目的 pod 依赖项。 (由应用开发者维护)

    真正的PodfilePodfile.lock 是什么样的?

    你可以比较Signal的PodfilePodfile.lock

    或者比较一下Wordpress的PodfilePodfile.lock

    两种思想流派都必须提交PodfilePodfile.lock。但是第二学派也将提交一个巨大的Pods项目

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 2017-05-03
      • 2017-04-24
      • 2021-03-14
      • 2016-11-13
      相关资源
      最近更新 更多