参考文档: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/