为什么我还在写 CocoaPods 的教程

CocoaPods 已经出现很多年了,相信很多同学都会使用,但是你真的知道 CocoaPods 是如何工作的吗?

RubyGems

The RubyGems software allows you to easily download, install, and use ruby software packages on your system. The software package is called a “gem” which contains a packaged Ruby application or library.

人们特别是电脑工程师们,常常从机器着想。他们认为:“这样做,机器就能运行的更快;这样做,机器运行效率更高;这样做,机器就会怎样怎样怎样。”实际上,我们需要从人的角度考虑问题,人们怎样编写程序或者怎样使用机器上应用程序。我们是主人,他们是仆人 ———— Ruby设计初衷

CocoaPods 是使用 Ruby 语言编写的一个作为 iOS 的包管理工具,而 RubyGems 是 Ruby 的包管理工具。安装 CocoaPods 需要包管理工具 RubyGems 安装,而 RubyGems 是 Mac 自带的工具。关于RubyGems的更多信息,可以参考 官方文档 。不过,RubyGems 中的 Gems 在国内访问速度很慢,不过可以使用 Ruby China。如果你想大体了解 Ruby,可以看这篇文章 Ruby。读到这里相信你对安装 CocoaPods 已经有了一定的了解。

CocoaPods 会被安装到 /Users/wangsuyan/.cocoapods/repos

更新到最新版本:sudo gem install cocoapods

安装指定版本: sudo gem install cocoapods -v 1.3.1

Git

掌握 CocoaPods ,需要了解一些 Git 的基本知识,当然你需要至少有一个代码托管平台,比如 GitHub。当然 这篇文章 讲的很不错。下面主要说明与这篇文章相关的内容。

  • git add -A
    把文提交到暂存区,等待提交

  • git commit -m "代码提交信息"
    提交代码到 HEAD,现在,你的改动已经提交到了 HEAD,但是还没到你的远端仓库

  • git tag 1.0
    给当前要提交的版本打个标签

  • git push --tags
    提交所有的 tag 到远端仓库

Pod init

它首先需要判断当前目录有没有 XCODEPROJ 项目,如果没有直接报错;若果有单个 XCODEPROJ 项目,会直接创建一个 podfile 文件;如果有多个XCODEPROJ 项目,需要指定一个项目,否则会报错:

[!] Multiple Xcode projects found, please specify one

Podfile

经过 Pod init 后会生成一个 Podfile 文件。它是一种规范,描述了一个或多个Xcode项目(target)的依赖关系。

最简单的 Podfile 文件,它仅仅给 Target lefeKit 添加一个 SDWebImage 库。

platform :ios, '9.0'
target 'lefeKit' do
  pod 'SDWebImage'
end
  • use_frameworks!

使用 Swift 或者动态库时需要

  • 版本,比如:pod 'SDWebImage', '~> 3.7.0'

假如 SDWebImage 目前只有下列版本:

4.1.0, 4.0.0, 4.0.0-beta2, 4.0.0-beta, 
3.8.2, 3.8.1, 3.8.0, 3.7.6, 3.7.5, 3.7.4, 3.7.3, 3.7.2, 3.7.1, 3.7.0, 3.6, 3.5.4, 3.5.2, 3.5.1, 3.5,3.4, 3.3, 3.2, 3.1, 3.0, 
2.7.4, 2.7, 2.6, 2.5, 2.4

那么 pod 'SDWebImage', '~> 3.7.0' 只会安装 3.7.6 版本,也就是最后一个 . 的最高版本;

pod 'SDWebImage', '> 3.7.0' 安装大于 3.7.0 版本,当然有 >=, <=<

pod 'SDWebImage', '3.7.6' 指定版本为 3.7.6

  • :path 指定本地的 Pod 库

pod 'FLoatDemo', :path => '~/Desktop/TestDemo/FLoatDemo'

这里的地址不是随便一个目录就可以,必须是一个 Pod 库,不然会报错

No podspec found for `FLoatDemo` in `~/Desktop/TestDemo/FLoatDemo`
  • 指定来源

如果第三方库不能满足您项目的需求,那么你可以 Fork一份,来修改第三方代码。

pod 'SDWebImage', :git => 'https://github.com/lefex/SDWebImage.git', :commit => '94cdb773d74967f7ba2feecf0d151012bd965fde'

还可以有::branch:tag => '3.1.1'

  • Subspecs

某个库可能很大,但是你仅仅需要某一部分,你只需要导入你需要的那部分即可,比如:

SDWebimage.png

如何我们只需要 pod ‘SDWebImage/Core’
也可以:pod 'SDWebImage', :subspecs => ['Core', 'GIF']

  • 去除警告

去除全部警告
inhibit_all_warnings!

去除某个库的警告
pod 'SDWebImage', '~> 4.1.0', :inhibit_warnings => true

pod install

如果修改了 Podfile 文件,那么执行 pod install。执行 pod install 后,会根据 Podfile 中的描述来安装所依赖的库。这时会生成很多文件。

  • Podfile.lock

这个文件主要用来锁定 Pods 库的版本。保证组内成员所使用的三方库都是统一版本。如果处理不当,这里很可能发生冲突,而且比较严重。

  • Manifest.lock

是 Podfile.lock 的副本,每次只要生成 Podfile.lock 时就会生成一个一样的 Manifest.lock 存储在 Pods 文件夹下。在每次项目 Build 的时候,会跑一下脚本检查一下 Podfile.lock 和 Manifest.lock 是否一致,如果不一致就抛出异常。这是它的脚本。

diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null
if [ $? != 0 ] ; then
    # print error to STDERR
    echo "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." >&2
    exit 1
fi
# This output is used by Xcode 'outputs' to avoid re-running this script phase.
echo "SUCCESS" > "${SCRIPT_OUTPUT_FILE_0}"

pod update

仅仅把 Pods 更新到新的版本时需要。比如 lefeKit 项目中当前 SDWebImage 的版本为 3.7.0,这时我修改 Podfile 文件为:pod 'SDWebImage', '>3.6.0',执行 pod install 后,本地的 SDWebImage 的版本任然为 3.7.0 。当执行 pod update 后变为 4.1.0

发布一个 Pod 库

创建

下面以 lefeKit 为例,说明创建私有库的过程。

  • pod lib create lefeKit
    这时需要输入提示问题,按照官方文档 逐步完成;
  • 登录自己的 github,创建一个名叫 lefeKit 的项目;
  • 修改 lefeKit.podspec 文件,
    s.source = { :git => 'https://github.com/lefex/lefeKit.git', :tag => s.version.to_s } 需要是你在 github 上创建的项目地址;s.homepage = 'https://github.com/lefex/lefeKit'
  • 根目录下(lefeKit)创建目录 Classes
  • pod lib lint 检查lefeKit.podspec 文件是否有错,成功则显示 lefeKit passed validation
  • 一切无误后,执行 pod trunk push lefeKit.podspec
  • pod trunk me 可以查看我注册的信息

这些步骤不是所有的都有先后顺序,创建私有库,关键是创建 xxx.podspec 文件和一个 Repository,让 xxx.podspec 关联到 Repository

发布成功的提示为:

--------------------------------------------------------------------------------
 🎉  Congrats

 🚀  lefeKit (1.0.0) successfully published
 📅  August 28th, 21:58
 🌎  https://cocoapods.org/pods/lefeKit
 👍  Tell your friends!
--------------------------------------------------------------------------------

更新私有库

  • 修改 lefeKit.podspec 文件中的版本号;
  • tag tat 1.0.0,添加一个 tag;
  • git push --tags
  • pod lib lint
  • pod trunk push lefeKit.podspec

错误总结

Authentication token is invalid or unverified. Either verify it with the email that was sent or register a new session.

遇到这个错误说明你还没有注册账号,注册一个邮箱 pod trunk register wsyxyxs@126.com

WARN  | url: The URL (https://github.com/lefex1/lefeKit) is not reachable

确保地址可以正确访问 https://github.com/lefex1/lefeKit 应为 https://github.com/lefex1/lefeKit

ERROR | [iOS] file patterns: The `source_files` pattern did not match any file.

找不到资源文件,在根目录下创建 Classes 文件夹,并创建文件。s.source_files = 'lefeKit/Classes/**/*'

Unable to find a pod with name, author, summary, or description matching `lefeKit`

这个是本地缓存的问题:
清理缓存 rm -rf ~/Library/Caches/Cocoapods,执行 pod setup

技巧

所有命令后添加 --verbose,会显示更多的调试信息。

推荐阅读

【iOS 国际化】如何把国际化时需要3天的工作量缩减到10分钟
Promise
微信iOS数据库是什么样的

感谢

关于 Podfile.lock 带来的痛

BY Blog

pluto-y

Cocoapods

Ruby China

===== 我是有底线的 ======
喜欢我的文章,欢迎关注我的新浪微博 Lefe_x,我会不定期的分享一些开发技巧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容