<RubyGems + Bundler
对于很多人来说,CocoaPods 是编程项目中依赖管理的首次引入。CocoaPods 的很多想法都来自类似项目(例如 RubyGems、Bundler、npm 和 Gradle)。
了解 Ruby 依赖管理非常有用,因为它允许你指定 CocoaPods 或其他 gem 的版本,并确保团队中的所有开发人员都使用完全相同的版本。本指南适用于希望确保团队依赖关系一致或使用未发布版本的 CocoaPods 的人员。
<RubyGems
RubyGems 是一项托管的 Ruby 库服务。它集中了你查找库和安装 Ruby 库/应用程序的地方。你一定见过 gem install xxx
。这些安装到一个集中的版本数据库中。如果你想象 CocoaPods 将所有库/框架安装到一个系统文件夹中,并在运行时链接它们,那么你就大致了解了 RubyGems 如何保留所有 gem。
这样做的缺点是无法确保需要特定版本库的项目可以使用该版本,它将始终使用最新版本。因此,作为一名开发人员,你安装新版本的库时会很谨慎,因为它将用于每个库/应用程序中。这是 Bundler 解决的问题。
<Bundler
Bundler 为你的应用程序创建了一个一致的应用程序环境,允许你指定库的版本。我们几乎完全照搬了这个想法用于 CocoaPods。你定义一个 Gemfile,说明你想要包含哪些库,还可以选择指定版本或范围。你运行 bundle install
,它将生成一个 Gemfile.lock,说明所有库的确切版本,然后任何其他使用该项目运行 bundle install
的人都将获得完全相同的版本。
<什么是 Gemfile?
如果你阅读了 Podfile 指南,它会感觉非常相似。Gemfile 是一个 Ruby 文件,用于定义你的 Ruby 依赖项。这里有一个 来自 Cocoa 项目的现有示例。
source 'https://rubygems.org.cn'
gem 'cocoapods'
gem 'cocoapods-keys'
gem 'fui', '~> 0.3.0'
gem 'xcpretty'
gem 'second_curtain', '~> 0.2.3'
gem 'fastlane'
所有 Gemfile 必须包含其 Gem 的来源,除此之外,你或多或少使用相同的语法。这会生成一个 Gemfile.lock,在这种情况下,它将 CocoaPods 锁定到版本 0.36.3。
<使用 Gemfile 的 CocoaPods
使用 Gemfile 设置,你可以运行 bundle install
进行安装,或运行 bundle update
在 Gemfile 的约束内进行更新。但是,从现在开始,你需要记住在通过 bundler 传入的任何终端命令之前运行 bundle exec
。鉴于 CocoaPods 包含在上面,这意味着任何时候你编写 pod XX YY
时,都需要执行 bundle exec pod XX YY
。
不使用 bundle exec
执行它将绕过 Gemfile 的特定版本控制,并将使用 RubyGems 中的最新版本库。这可能完全是同一版本,但通常不是。如果你正在包含 CocoaPods 插件,那么它们也可能无法运行。
这意味着你可以确保项目的基础工具与你的个人库一样进行版本控制。
<使用 master CocoaPods
通常在版本发布之间,你可能希望使用 Gemfile 来使用未发布的 CocoaPods 版本。由于项目的规模,当我们确定它不会破坏项目时,我们会尝试缓慢发布。与 CocoaPods 一样,你可以轻松使用 master 或你的 Ruby 项目的分支。这里是一个 使用 CocoaPods master 的 Gemfile 示例。
source 'https://rubygems.org.cn'
gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git'
gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git'
gem 'xcodeproj', :git => 'https://github.com/CocoaPods/Xcodeproj.git'
gem 'cocoapods-keys', :git => 'https://github.com/orta/cocoapods-keys.git'
gem 'xcpretty'
gem 'shenzhen'
gem 'sbconstants'
运行 bundle install
将获取 master 中的版本。由于 CocoaPods 是多个 gem,你可能必须包含 其他依赖项,如上所示。