Cocoapods总结

参考文档:http://www.jianshu.com/p/f79589c21dc4
http://www.jianshu.com/p/b64b4fd08d3c
http://www.cnblogs.com/hankkk/p/5703050.html
http://www.jianshu.com/p/a977c0a03bf4
文章内容

1.Cocoapods介绍,作用及原理
2.Cocoapods安装
3.Cocoapods使用
4.Cocoapods补充
5.Cocoapods彻底删除(因为之前我已经装过了,卸载重新走一遍)

一.Cocoapods介绍,作用及原理
介绍:CocoaPods是一个负责管理iOS项目中第三方开源库的工具。

作用:更加便捷的添加管理更新第三库的使用,如果不使用Cocoapods,一般需要以下操作

1:下载开源库的源代码并引入工程
2:向工程中添加开源库使用到的framework
3:解决开源库和开源库以及开源库和工程之间的依赖关系、检查重复添加的framework等问题
4:如果开源库有更新的时候,还需要将工程中使用的开源库删除,重新执行前面的三个步骤,这样的操作台繁琐

在使用CocoaPods后,我们只需要把用到的开源库放到一个名为Podfile的文件中,然后执行pod install就可以了,Cocoapods就会自动将这些第三方开源库的源码下载下来,并且为我们的工程设置好响应的系统依赖和编译参数。

原理:CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。

二.Cocoapods安装
1:设置ruby的软件源(这是因为ruby的软件源rubygems.org因为使用亚马逊的云服务,被我天朝屏蔽了)
使用国内淘宝的ruby镜像, 命令如下

$ sudo gem sources -r https://rubygems.org/
$ sudo gem sources -a https://ruby.taobao.org/

验证是否安装成功

$  gem sources -l
*** CURRENT SOURCES ***
https://ruby.taobao.org/

2:设置gem为最新版本
如果gem太老,可以尝试用如下命令升级gem:

$  sudo gem update --system

升级成功后会提示:

Latest version currently installed. Aborting.

3:执行安装CocoaPods命令

$ sudo gem install  cocoapods

如果报以下错误:

ERROR:  While executing gem ... (Errno::EPERM)

Operation not permitted - /usr/bin/xcodeproj

解决方案1:
执行下面的命令并重启

$ sudo nvram boot-args="rootless=0"
$ sudo reboot

重启之后, 执行这个命令检查

$ sudo gem install cocoapods -V

如果依旧有错误,使用第二个方案
解决方案2:

$ sudo gem install -n /usr/local/bin cocoapods

Mac OS mojave又有新错误
错误2:

Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
    ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20200426-7198-a15w8j.rb extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.12.2/gem_make.out

解决:
打开/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

结果提示

The file /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg does not exist.

后面查找下,发现确实不存在,要先安装

xcode-select --install

安装完成后,再执行上面open,再执行sudo gem install cocoapods,再检查版本看是否安装完成$ sudo gem install cocoapods -V

$ pod setup

还有一点需要注意,pod setup在执行时,会输出Setting up CocoaPods master repo,但是会等待比较久的时间。这步其实是 Cocoapods 在将它的信息下载到 ~/.cocoapods目录下,如果你等太久,可以试着 cd 到那个目录,用du -sh *来查看下载进度。
(或者把别人的master文件拷贝过来)
安装成功后,你会看到:

Setup completed

特别补充:网上之前看到有人遇到这个问题,http.postBuffer设置成500M还不够大,设置成1024M才成功

下载了270M后的某个时候,又报错:

Setting up CocoaPods master repo 
[!] /usr/bin/git clone https://github.com/CocoaPods/Specs.git master –depth=1 
Cloning into ‘master’… 
error: RPC failed; result=18, HTTP code = 200 
fatal: The remote end hung up unexpectedly 
fatal: early EOF 
fatal: index-pack failed

郁闷了,白等了好久,查资料后:

$ git config --global http.postBuffer 1073741824

$ git config --list
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999 

重新执行:

$ pod setup

pod install一直卡住;Analyzing dependencies
Cloning spec repo cocoapods from https://github.com/CocoaPods/Specs.git

新版的 CocoaPods 不允许用pod repo add直接添加master库了,但是依然可以:

$ cd ~/.cocoapods/repos 
$ pod repo remove master
$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git master

最后进入自己的工程,在自己工程的podFile第一行加上:

source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

完事之后记得remove trunk ,执行下面的命令

pod repo remove trunk

如果不执行remove还可能会出现 CDN:trunk 的问题。
三.Cocoapods使用
1:新建项目CocoaPodsTest
2:cd 到项目路径
3:创建或者编辑Podfile文件

$ vi Podfile

插入

i

插入内容如下:

platform :ios, '8.0'

target 'JiHe' do
    pod 'MBProgressHUD'
    pod 'MJExtension'
    pod 'Reachability'
    pod 'SDWebImage'
    pod 'FMDB'
    pod 'Masonry'
    pod 'Reachability'
    pod 'pop'
    pod 'IQKeyboardManager'
    pod 'AFNetworking'
    pod 'AMap2DMap-NO-IDFA'
    pod 'AMapSearch-NO-IDFA'
    pod 'AMapLocation-NO-IDFA'
end

按Esc退出编辑,再:,输入wq保存退出

:wq

四.Cocoapods补充
安装和使用之后,可以看到,工程的根目录下多了三个东西:CocoaPodsDemo.xcworkspace、Podfile.lock文件和Pods目录。提示我们从现在起,我们需要使用CocoaPodsDemo.xcworkspace文件来进行开发。对于Podfile.lock需要了解几点:

1:第一次 pod install 时生成记录每个 Pod 版本
2:Podfile.lock 锁定当前各依赖库的版本之后 pod install 不会更改版本pod update 才会改版本
3:多人协作时防止第三方库升级时造成版本不一致

pod install :

这个是第一次在工程里面使用pods的时候使用,并且,也是每次你编辑你的Podfile(添加、移除、更新)的时候使用。

每次运行pod install命令的时候,在下载、安装新的库的同时,也会把你安装的每个库的版本都写在了Podfile.lock文件里面。这个文件记录你每个安装库的版本号,并且锁定了这些版本。

当你使用pod install它只解决了pods里面,但不在Podfile.lock文件里面的那些库之间的依赖。对于在Podfile.lock里面所列出的那些库,会下载在Podfile.lock里面明确的版本,并不会去检查是否该库有新的版本。对于还不在Podfile.lock里面的库,会找到Podfile里面描述对应版本(例如:pod "MyPod", "~>1.2")。

pod outdated:
当你运行pod outdated命令,CocoaPods会列出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)。这个意思就是,如果你运行pod update PODNAME,如果这个库有新的版本,并且新版本仍然符合在Podfile里的限制,它就会被更新。

pod update:
当你运行 pod update PODNAME 命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile里面的版本限制。

如果你运行pod update,后面没有跟库的名字,CocoaPods就会更新每一个Podfile里面的库到尽可能的最新版本。

正确用法:

你应该使用pod update PODNAME去只更新某个特定的库(检查是否有新版本,并尽可能更新到新的版本)。对应的,你应该使用pod install,这个命令不会更新那些已经安装了的库。

当你在你的Podfile里面添加了一个库的时候,你应该使用pod install,而不是pod update,这样既安装了这个库,也不需要去更新其它的已安装库。

你应该使用pod update去更新某个特定的库,或者所有的库(在Podfile的限制中)。

提交你的Podfile.lock文件:

在此提醒,即使你一向以来,不commit你的Pods文件夹到远程仓库,你也应该commit并push到远程仓库中。

要不然,就会破坏整个逻辑,没有了Podfile.lock限制你的Pods中的库的版本。

举例:

以下会举例说明在各个场景下的使用。

场景1:User1创建了一个工程

User1创建了一个工程,并且想使用A、B、C这三个库,所以他就创建了一个含有这个三个库的Podfile,并且运行了pod intall。

这样就会安装了A、B、C三个库到这个工程里面,假设我们的版本都为1.0.0。

因此Podfile.lock跟踪并记录A、B、C这三个库以及版本号1.0.0。

顺便说一下:由于这个工程是第一次运行pod install,并且Pods.xcodeproj工程文件还不存在,所以这个命令也会同时创建Pods.xcodeproj以及.xcworkspace工程文件,这只是这个命令的一个副作用,并不是主要目的。

场景2:User1添加了一个库

之后,User1添加了一个库D到Podfile文件中。

然后他就应该运行pod install命令了。所以即使库B的开发者发布了B的一个新版本1.1.0。但只要是在第一次执行pod install之后发布的,那么B的版本仍然是1.0.0。因为User1只是希望添加一个新库D,不希望更新库B。

这就是很多人容易出错的地方,因为他们在这里使用了pod update,因为想着“更新我的工程一个新的库而已”。这里要注意!

场景3:User2加入到这个工程中

然后,User2,一个之前没有参与到这个工程的人,加入了。他clone了一份仓库,然后使用pod install命令。

Podfile.lock的内容就会保证User1和User2会得到完全一样的pods,前提是Podfile.lock被提交到git仓库中。

即使库C的版本已经更新到了1.2.0,User2仍然会使用C的1.0.0版本,因为C已经在Podfile.lock里面注册过了,C的1.0.0版本已经被Podfile.lock锁住了。

场景4:检查某个库的新版本

之后,User1想检查pods里面是否有可用的更新时,他执行了pod outdated,这个命令执行后,会列出来:B有了1.1.0版本,C有了1.2.0版本。

这时候,User1打算更新库B,但不更新库C,所以执行pod update B,这样就把B从1.0.0更新到1.1.0(同时更新Podfile.lock里面对B的版本记录),此时,C仍然是1.0.0版本,不会更新。

在Podfile中使用明确版本还不够

有些人认为在Podfile中明确某个库的版本,例如:pod 'A', '1.0.0' ,足以保证所有项目里面的人都会使用完全一样的版本。

这个时候,他们可能会觉得,此时如果添加一个新库的时候,我使用pod update并不会去更新其它的库,因为其它的库已经被限定了固定的版本号。

但事实上,这不足以保证User1和User2的pods中库的版本会完全一样。

一个典型的例子是,如果库A有一个对库A2的依赖(声明在A.podspec中:dependency 'A2', '~> 3.0'),如果这样的话,使用 pod 'A', '1.0.0' 在你的Podfile中,的确会让User1和User2都使用同样版本的库A(1.0.0),然而:

最后User1可能使用A的依赖库A2的版本为3.4(因为3.4是当时User1使用的最新版本),但User2使用的库A2版本是3.5(假设A2的开发者刚刚发布了A2的新版本3.5)。

所以只有一个方法来保证某项目的每个开发者都使用相同版本的库,就是每个电脑中都使用同样的Podfile.lock,并且合理使用pod install 和 pod update。

五.Mac彻底删除CocoaPods的方法
1:罗列依赖库

$ gem list --local | grep cocoapods

显示的依赖库

cocoapods (1.2.1)
cocoapods-core (1.2.1)
cocoapods-deintegrate (1.0.1)
cocoapods-downloader (1.1.3)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.0.0)
cocoapods-trunk (1.2.0)
cocoapods-try (1.1.0)

2:遍历删除依赖库

$ for i in $( gem list --local --no-version | grep cocoapods );
do 
   sudo   gem uninstall $i; 
done

输入密码,输入Y确认

Password:
Remove executables:
    pod, sandbox-pod

in addition to the gem? [Yn]  Y

删除成功

Removing pod
Removing sandbox-pod
Successfully uninstalled cocoapods-1.2.1
Successfully uninstalled cocoapods-core-1.2.1
Successfully uninstalled cocoapods-deintegrate-1.0.1
Successfully uninstalled cocoapods-downloader-1.1.3
Successfully uninstalled cocoapods-plugins-1.0.0
Successfully uninstalled cocoapods-search-1.0.0
Successfully uninstalled cocoapods-stats-1.0.0
Successfully uninstalled cocoapods-trunk-1.2.0
Successfully uninstalled cocoapods-try-1.1.0

3:进一步彻底删除文件夹

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

推荐阅读更多精彩内容

  • 一、预备知识 1、Rvm介绍:全称 Ruby Version Manager,是安装和管理ruby的一种工具。(下...
    xx明阅读 1,276评论 0 2
  • 项目组件化、平台化是技术公司的共同目标,越来越多的技术公司推崇使用pod管理第三方库以及私有组件,一方面使项目架构...
    swu_luo阅读 21,613评论 0 39
  • Ruby 安装 要安装cocospods 首先需要安装ruby,可以先安装xcode,再安装macport ,最后...
    山天大畜阅读 1,846评论 0 1
  • 双十一是购物狂欢节,当11号到来那一刻,我便听到“快抢”的一声从隔壁宿舍传出来,这是在参与某宝购物节的人儿。有人会...
    iceyang阅读 147评论 0 1
  • 2017.3.21 昨天超级忙碌,从早上到晚上的课程,还有忘记的作业,在地铁上用手机,打了一千多的作业,回到学校整...
    薇糖糖糖阅读 121评论 0 0