【发布时间】:2014-04-11 06:02:20
【问题描述】:
什么是Cocoapods?我看到很多开发人员在开发应用程序来安装 API 时一直在使用 Pods,但我不明白为什么不能手动导入文件。他们的目的是什么,他们有什么帮助?
【问题讨论】:
标签: xcode cocoapods dependency-management
什么是Cocoapods?我看到很多开发人员在开发应用程序来安装 API 时一直在使用 Pods,但我不明白为什么不能手动导入文件。他们的目的是什么,他们有什么帮助?
【问题讨论】:
标签: xcode cocoapods dependency-management
“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 会自动在您的项目中创建一个确认文件,您可以简单地将其包含在适当的位置。
【讨论】:
【讨论】:
CocoaPods 是一个用于 Objective-C 项目的依赖管理工具,类似于 Maven 用于 Java 项目的依赖管理工具,它是用 Ruby 编写的,由多个 Ruby Gem 组成。这个想法是,一旦您将第三方库添加到您的项目中,您将不再需要检查是否有任何更新的版本。 CocoaPods 会为你处理这些。它还使返回到某个版本的库变得超级容易。要使用它,请按照以下步骤操作。更多详情可以在官网http://cocoapods.org找到
sudo gem 安装 cocoapods
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
pod 'AFNetworking'
pod 'ARAnalytics', '~> 2.7'
对于每个库,您可以选择指定最低版本。
pod setup pod install open YourApp.xcworkspace
现在您的项目已准备就绪。注意上面的最后一个命令是打开 YourApp.xcworkspace,而不是 YourApp.xcodeproj,否则在构建应用时会出现“library not found -lPods”错误。
【讨论】:
使用 cocoapods 或任何依赖管理器,您可以指定一个 framework 以及要使用的 version。
这样,团队的所有开发人员都安装了相同的版本。
它的逻辑与 package.json + package-lock.json 或 Gemfile + Gemfile.lock 非常相似,您可以在其中列出所有 node 或 gem 依赖项。
除了每个项目之外,语言对于是否提交依赖项的实际文件都有自己的约定,即所有项目都包含依赖项和版本列表。
一个学派将您的 pods 目录视为派生数据。只要您在项目中检查了podfile 和lock 文件,并且您应该......那么理论上任何人都可以通过运行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 install 或pod 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
podspec 和 podfile 之间的区别是什么?podspec 定义了 pod 本身。 (由 pod 开发人员维护)podfile 列出项目的 pod 依赖项。 (由应用开发者维护)Podfile 和Podfile.lock 是什么样的?你可以比较Signal的Podfile和Podfile.lock
或者比较一下Wordpress的Podfile和Podfile.lock
两种思想流派都必须提交Podfile 和Podfile.lock。但是第二学派也将提交一个巨大的Pods项目
【讨论】: