在开发的过程中,我们经常要使用(依赖)其他第三方库,而这些库或框架还有可能依赖于其他的第三方库和框架,这样就会形成一个复杂的依赖关系网,而手动管理这些库或框架是非常麻烦的,首先要找到并下载这些库或框架,还要注意版本的兼容性问题,继而把它们添加到当前工程中,还需要配置其相关的环境变量,这些都去手动完成是非常耗费精力的,所幸我们还有依赖管理工具,这将大大减少我们的工作量,CocoaPods和Carthage工具就可以帮助我们完成项目依赖的管理工作。
CocoaPods依赖管理工具
CocoaPods是最有影响力的OS X和IOS项目依赖管理工具,于2011年发布,经过多年的发展,它已经非常完善了,CocoaPods支持项目中采用Objective-C和Swift语言。CocoaPods会将第三方库的源代码编译为静态链接库.a文件或是动态框架.framework文件的形式,并将它们添加到项目中,建立依赖关系。
安装CocoaPods
由于CocoaPods工具是使用Ruby语言开发的,在OS X系统下默认安装了Ruby运行环境,所以不需要另外安装Ruby运行环境了。CocoaPods的下载和安装可以使用Ruby包管理工具gem。
安装流程:
- 1.在终端中执行:sudo gem install cocoapods
(如果报错ERROR: Could not find a valid gem 'cocoapods' (>= 0) in any repository,可以尝试执行:sudo gem install cocoapods --source http://rubygems.org) - 2.等待安装,当完成时终端输出如图:
注:如果这个命令执行了很长时间但没有反应或出现如下错误:ERROR: Could not find a valid gem 'cocoa pods' (> = 0),here is why: Unable to download data from https://rubygems.org/ - ERROR :Connection reset by peer - SSL_connect (https://rubygems.org/latest_apecs.4.8.gz)这是由于gem工具无法访问默认的Ruby源(rubygems.org),此时我们可以把Ruby源换为国内的镜像源。在终端执行如下命令:
sudo gem source --remove https://rubygems.org/
sudo gem sources -- a http://gems.ruby-china.org/
- 3.安装指令成功之后还需要进行设置,执行:pod setup
该指令会在本地创建~/.cocoapods/文件夹,并将CocoaPods的GitHub库(https://github.com/CocoaPods/Specs)下载到该文件夹中。这样当配置依赖关系时,可以直接使用本地文件。由于下载的内容较多(300MB左右),setup执行的时间会表较长,而且容易失败,不过百度上有应对其下载失败的办法。例如这篇:(https://www.jianshu.com/p/b561726ac3fd) 。
然后就可以搜索我们要使用的第三方库了,可以通过网站https://cocoapods.org进行搜索,一个多么朴素的界面:
当然也可以通过pod指令进行搜索,在终端执行:pod search 第三方库名,例如:pod search AFNetworking,结果如图:
当然并不只有这一个库的信息,而是巨多,当然你全名搜索的话,你需要的在第一条,我本来想数数的,结果数乱了,对,我就是这么无聊,找到需要的后,按q退出,我差点直接关了终端你造吗,我果然依旧菜......
接下来就是项目与第三库的搭配了,使用CocoaPods工具管理第三方库时,会将第三方提供的源代码进行编译,而编译的结果有两种形式,分别为静态链接库.a文件和动态框架.framework文件,至于如何选择,就需要看项目中调用第三方库的代码采用何种语言,另外还需要看第三方库采用何种语言。
示例:以动态框架库形式管理依赖
- 1.通过终端进入项目工程目录下,即*.xcodeproj文件所在的目录,执行 pod init指令。
例如:
- 2.该指令执行成功后,会在当前目录下生成一个Podfile文件,该文件是一个文本文件。
这个文本文件的内容是这样的:
然后修改Podfile文件,例如这样:
注:依赖库后面的数值表示依赖版本,它有如下几种表示方式:
=3.1.0, 表示大于等于3.1.0版本。
<=3.1.0, 表示小于等于3.1.0版本。
~>3.1.0, 表示大于等于3.1.0版本,小于下一个主版本,即小于4.0。
3.1.0, 表示大于3.1.0版本。
<3.1.0, 表示小于3.1.0版本。
3.1.0, 表示等于3.1.0版本。
Podfile文件修改完成后,执行pod install指令,就可以安装依赖关系了,安装成功后,目录是这样的:
playPlay.xcworkspace、Podfile.lock、Pods是安装过程中创建的,其中的Pods目录是工程所依赖库或框架源代码工程。如果通过Xcode启动工程,应该通过playPlay.xcworkspace工作空间文件启动,依赖成功后是这样的:
关于pod setup命令报错的处理办法
今天做了个项目,在Podfile中新增了几个第三方,准备pod update/install的时候,发现下面的报错
然后赶紧去百度了,网上说先清除下CocoaPods的缓存,于是继续进行
删除缓存以后,再次pod update结果继续是一堆的报错
然后继续百度上面的报错,说是因为cocoaPods下面没有master文件夹造成的...然后开始使用pod setUp去clone这个文件夹回来,结果多次尝试都是失败告终!
那么这个报错原因是什么呢? 怎么解决?由于网上的解决方案太杂太乱,方法步骤没有截图,导致很难使用,于是写下了此文,欢迎各位雅正!
下面,进入今天正题,看看原因和解决方案
失败原因:pod setup的本质就是将https://github.com/CocoaPods/Specs 上的Specs项目clone到~/.cocoapods/repos目录下。若此目录下已有Specs项目,则会将项目更新到最新的状态。由于Specs很大,容易导致pod setup失败。这时就需要我们手动安装Specs。若直接从github上下载zip文件,由于缺少git文件,会导致cocoa pods不使用。
由于直接pod setup用时太久,很容易导致失败,使用 cocoapods 的镜像索引来提高下载速度。这里给出国内的一个镜像索引地址:
https://coding.net/u/hging/p/Specs/git
点击打开以后,我们获得他的git地址,为后面的clone做准备..操作方法截屏如下
好了,国内的cocoapods 的镜像索引有了,那么下面我们就来进行相关操作了
1.我们先去~.cocoapods文件去看看
你会发现有下面的文件
如果有master的话,建议你先删除掉master这个文件夹,因为马上我们下载下来的文件夹,需要该名称master
2.删除master文件以后,我们打开终端,将podspec索引文件clone到本地的~/.cocoapods/repos/master位置
我们先切到~./cocoapods文件夹处
然后利用我们上面拿到的git地址clone就可以了
后面我们静静的等待就可以了,大概10几分钟可以下载完成
再去文件夹里看看,发现master文件夹已经生成了,并且全部文件也已经全部下载下来
此时,我们再次 pod update下,更新下我们的第三方库
安装完一堆配置文件后,然后自动为我们更新了第三方
至此,我们解决了pod setup失败,导致项目中的cocoaPods无法使用的问题。
此段内容摘自D了个Y的简书。
spec资源中不包含某个库的配置文件导致pod install报错
cocoapods安装完成后,会在用户根目录下有个隐藏文件夹,里面存放了cocoapods所收录的库的配置信息。路径如下(使用command + shift + . 可以显示隐藏的文件夹):
当执行pod update或pod install的时候,会因为在本地.cocoapods下找不到相应的配置文件而报错,报错如图:
错误译文:
找不到LookinServer的规范
你可以
- 过期的源仓库,您可以使用“pod repo update”或“pod install--repo update”更新。
- 输入名称或版本错误。
- 未将承载Podspec的源仓库添加到您的podfile。
根据提示,使用pod repo update命令进行更新,pod repo update会更新整个.cocoapods下的所有库,执行如图:
当pod repo update命令执行成功后,再次执行pod update或pod install命令,完成库的更新:
如果pod repo update命令执行的时间过长,可以进行选择性的库更新,找到对应库的路径,然后执行更新命令,例如:
pod init 报错error: tool ‘xcodebuild‘ requires Xcode, but active developer directory
Xcode -> Preferences -> Locations 检查如下位置是否选择 :
Xcode14 创建的新项目,无法进行Pod init,报错如下 :
Carthage依赖管理工具
Carthage是一个轻量级的项目依赖管理工具,主张“去中心化”和“非侵入性”。Cocoapods搭建了一个中心库(cocoapods.org),第三方库被收录到该中心库中,没有收录的第三方库是不能使用Cocoapods管理的,这就是所谓的“中心化”思想,而Carthage没有这样的中心库,第三方库基本上都是从GitHub或私有Git库中下载的,这就是“去中心化”。另外,Cocoapods在下载第三方库后,会将其编译成静态链接库或动态框架文件,然后会修改Xcode项目属性配置依赖关系,这就是“侵入性”。而Carthage下载成功之后,会将第三库编译为动态框架,由开发人员自己配置依赖关系,Carthage不会修改Xcode项目属性,这就是非侵入性。
注:使用Carthage有两个限制:
- 1.第三库只能编译为框架。
- 2.IOS项目的版本必须是IOS8以上的版本。
安装Carthage
Carthage工具可以通过两种方式安装,一种是在https://github.com/Carthage/Carthage/releases网站下载已经编译好的安装包Carthage.pkg进行安装。
另一种是通过Homebrew工具安装,Homebrew是用来管理OS X系统下安装包的工具。要确定是否安装了Homebrew工具,可以在终端执行brew update指令,如果没有安装Homebrew工具,终端会提示brew命令无法执行,此时可以在终端中执行如下指令:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
命令执行成功后,就可以在终端中执行brew install carthage指令进行安装。
Cartfile文件
与CocoaPods的Podfile类似,Carthage使用名为Cartfile的文件描述依赖库,该文件的内容示例如下:
从Carthage文件的内容可见依赖库的来源有Git和GitHub,Git是私有库。git或github是依赖库名或git地址,第1行的Alamofire/Alamofire与第2行的AFNetworking/AFNetworking即为依赖库名,指定依赖库一般指定GitHub上库的"用户名/项目名",这个名字如果不能确定,需要到GitHub上查询确定。
第4行为git地址,支持git所支持的所有协议,如:https、git和ssh等,git库可以创建多个分支,所以可以在Carthage文件中指定分支名,其中第3行与第4行中的"main"都是分支名。有了分支,不需要指定版本号。
与Podfile类似,在Cartfile文件中可以指定依赖库版本,它主要有如下表示方式:
1 == 3.0,表示等于3.0版本。
2 >= 3.0,表示大于等于3.0版本。
3 ~> 3.0,表示大于等于3.0版本,小于下一个主版本,即小于4.0。
Carthage依赖管理示例:
- 1.首先通过终端进入CarthagePlay工程目录下,即*.xcodeproj文件所在目录,并创建Cartfile文本:
-
2.将其内容修改如下:
3.执行Carthage update --platform iOS指令,安装依赖关系:
Carthage update --platform iOS指令的参数platform iOS表示只考虑IOS平台,执行过程分为两个阶段,首先将库下载到本地,然后再使用xcodebuild命令将库编译为框架。
Carthage update --platform iOS指令执行成功后,CarthagePlay工程目录下会多出一个Carthage目录,该目录中又包含了两个目录Build和Checkouts。Build目录中存放编译好的framework文件,根据不同的平台它会包含不同的目录,如Mac、IOS、tvOS和watchOS。
Checkouts目录是下载的第三方库的源代码。
Carthage需要我们自己配置CarthagePlay工程与第三方库的依赖关系:
- 1.在Xcode工程中打开TARGETS ——> CarthagePlay ——> General,在Linked Frameworks and Libraries中点击 + 按钮,在弹出的对话框中单击Add Other按钮,找到Build目录中的framework文件,添加依赖框架。
添加成功后的目录结构:
- 2.第三方库添加完成,还需要运行脚本(Run Script)。运行脚本,就是在编译时执行命令。Carthage提供的运行脚本可以将框架复制到运行环境目录下。在Xcode工程中打开TARGETS ——> CarthagePlay ——>Build Phases,如果没有Run Script部分,可以通过菜单Editor ——> Add Build Phase ——> Add Run Script Build Phases菜单项添加。
在Run Script部分的脚本区域输入:
- 3.尝试进行编译,如果报错如下,可以command+shift+k清空编译缓存重新编译。
- 4.在项目中引入第三方库的头文件,如果报错如下:
可以尝试在TARGETS——>Build Setting——>Search Paths——>Header Search Paths中将第三方库的头文件文件夹拖入其中。
至此,可以导入第三方库并使用
Carthage更新
因为最近改动了公司封装的工具包项目,而工具包是由Carthage进行管理的,我用SourceTree拉去工具包代码后,进行了代码更改,然后推送到远端并打上了标签,但当我在本地项目执行Carthage update --platform iOS命令之后,运行项目成功的报错了。
译:请更新到最新的迦太基版本:0.34.0。您当前的版本是0.33.3。
所以我赶快的查看了一下Carthage的版本,果然它说的是对的:
那就更新一下吧,毕竟报错了(后来我才发现我太天真了,报错的原因根本不是因为版本的原因导致的,但是升级Carthage的过程还是值得记录)。所以我执行了brew upgrade carthage命令进行更新,本想的是万事大吉,不曾想却是当场报错。
译:您的用户无法写入以下目录:
/usr/local/include
/usr/local/lib
/usr/local/lib/pkgconfig
/usr/local/sbin
您应该将这些目录的所有权更改为您的用户,并确保您的用户具有写权限。
我自己使用的电脑,我为什么没有权限,难道是因为电脑是公司配置的?所以我赶紧去找了一下解决的办法,毕竟我是一个面向百度、谷歌、火狐、对象进行编程的码农。哦,错了,对象没有。一番查找,果然还是找到了解决的办法:
- 1.点击访达 -> 前往文件夹 -> 输入/usr
- 2.查看文件夹,发现错误中描述的文件果然都在,然后右击local文件夹 -> 显示简介,对权限进行更改。
- 3.回到终端,继续执行命令brew upgrade carthage,开始执行更新。
- 4.但是它又报错了,执行时失败,但是命令并没有立即停止执行,还在继续,那就等等吧。
- 5.报警告了,从源安装失败,这也太坎坷了,但命令仍旧没有停下,而是在继续执行,
译:您处于“分离头”状态。您可以四处查看,进行实验性更改并提交它们,并且可以放弃在此状态下所做的任何提交,而不影响执行另一次签出的任何分支。
译:如果要创建新分支以保留创建的提交,可以(现在或以后)通过再次使用-b和checkout命令来创建。示例:git checkout-b<new-branch-name>
- 6.命令终于结束了,哎?这咋还把啤酒端上来了?难道成功了?
- 7.赶快检查了一下,执行Carthage version查看版本,果然更新了。
Dependency "xxx" has no shared framework schemes 错误
那么问题来了,究竟是什么导致报错的,查看了一下执行Carthage update --platform iOS命令的输出,原来早已报错了,只是当时没有留意,急着运行项目了,但framework已经编译失败了。报错如图:
后来通过版本对比,发现我编译的项目的在打开.xcodeproj包内容时,是这样的:
而编译没有问题的项目,在打开.xcodeproj包内容时,是这样的:
处理办法,使用Xcode打开该项目,点击Product -> Scheme -> Manage Schemes...,打开如图所示:
上面操作完成后,会弹出下面的界面,直接关闭即可,然后查看文件是否已经生成,然后推送代码到远端,重新执行Carthage update --platform iOS命令。
xcuserdata文件夹的简要介绍
此文件夹是项目创建时跟随创建的,里面路径类似位:
/Users/shawn/Desktop/iOS-Common/Common.xcodeproj/xcuserdata/shawn.xcuserdatad/xcschemes/xcschememanagement.plist
执行上面的操作后,则会把该目录下的" shawn.xcuserdatad -> xcschemes -> ***.xcscheme "文件移动到" xcshareddata->xcschemes "文件夹下;
删除此文件夹的话," xcschememanagement.plist "会在启动该项目时重建的,但是" ***.xcscheme "文件是不会重建的,就会丢失" xcscheme "文件。
此目录下会有多个文件夹,这根据不同的用户来命名的,当使用版本管理器时,而且没有忽略该文件夹,就会发现此目录下就可能会有多个人的目录。
一般来说,此目录不太建议放到svn里面,因为这个目录放的是一些个人设置,还有断点设置一类的,即使你放到svn里面,别人也不会加载,因为Xcode只会加载对应用户名的文件夹。
需要和别人共享的xcschemes,应该放到下面的 " xcshareddata "文件夹,然后使用svn来同步 " xcshareddata "文件夹
xcshareddata 文件夹的简要介绍
项目一开始时,是没有" xcshareddata "文件夹的。当如上面的操作中 " shared "复选框被选中,则会把 "xcuserdata "里相应的xcscheme文件移动到本目录的xcschemes文件夹下,这时才会创建此文件夹。
多人开发时,为了支持共享xcscheme,一般会勾选" shared ",这样,相应的" ***.xcscheme "就会被移动到该目录下。所以在多人开发时,应该把此目录放到svn里去同步,同时注意,被共享的" ***.xcscheme "也会影响到队友,要慎重修改。
注:删除此目录后,重新打开项目也不会重建的,删之要慎重。如果删除此目录,而" xcuserdata "文件夹下也没有xcscheme文件,那么你打开项目,j就可能会无法编译了。如果出现了这种情况,那么你把" xcuserdata "文件夹给删除掉,重启项目,Xcode会重新创建xcuserdata文件夹和默认的xcscheme文件。