说起 iOS 开发的包管理,大家就不由得会想起 CocoaPods, 它确实是一个强大的工具。但这次咱们来关注另外一个包管理工具 Carthage,如果说 CocoaPods 像一个航母,一应俱全,坚实稳固。那么 Carthage 就像一艘巡洋舰,机动灵活,攻击迅速。

Carthage 和 CoaoaPods 的区别

CoaoaPods 是一套整体解决方案,我们在 Podfile 中指定好我们需要的第三方库。然后 CocoaPods 就会进行下载,集成,然后修改或者创建我们项目的 workspace 文件,这一系列整体操作。

相比之下,Carthage 就要轻量很多,它也会一个叫做 Cartfile 描述文件,但 Carthage 不会对我们的项目结构进行任何修改,更不多创建 workspace。它只是根据我们描述文件中配置的第三方库,将他们下载到本地,然后使用 xcodebuild 构建成 framework 文件。然后由我们自己将这些库集成到项目中。Carthage 使用的是一种非侵入性的哲学。

所谓非侵入性哲学,其实可以这么理解。我想使用过 CocoaPods 的同学们,可能都会经历过这样一种体验,尤其是在最开始使用它的时候 - 我们精心在 Podfile 中配置好我们所需的第三方库,并且按照 CocoaPods 的指定步骤,输入命令,然后等待这些第三方库乖乖的集成到项目中。但总有那么几次,会事与愿违,比如运行完 pod update 命令,看似一切顺利,workspace 也成功的更新了。但当我们真正编译构建项目的时候,某些莫名其妙的错误出现了,类似于这种:

diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory

遇到这种问题后,我们只能经过一系列的搜索,然后解决这些问题。本来我们使用包管理,就是为了集成第三方库的时候更加方便,迅速。结果处理这些包管理的错误却又浪费了我们很多时间。

如果使用 Carthage 我们就不必让这些问题困扰了,因为 Carthage 本身不会对我们的项目结构进行任何改动,类似 CocoaPods 产生的这些附加问题,就不会发生了。

但是 Carthage 就没有 CocoaPods 的集成操作能力了,作为开发者,必须在 Carthage 将第三方库构建完成后,手动的关联到项目中。

另外 Carthage 除了非侵入性,它还是去中心化的,它的包管理不像 CocoaPods 那样,有一个中心服务器(cocoapods.org),来管理各个包的元信息,而是依赖于每个第三方库自己的源地址,比如 Github。这样也是有利有弊,好处就是我们对包管理不再依赖中心服务器,不会受中心服务器信息量和稳定性的限制(尤其是在我们这里的网络访问状况问题),弊端嘛,就是我们想查找第三方库的时候,也没有一个中心服务器来帮助我们进行索引,而是必须从网络上自行查找。

两种哲学,产生了两个产品 CarthageCocoaPods 各有优劣,如何选择,就要看各位自己的需求了。

开始使用 Carthage

Carthage 的基本情况介绍完了,接下来咱就来看一下怎样使用 Carthage 来进行包管理吧。

首先我们需要安装 Carthage 环境,可以在它的 Github 主页上,找到下载地址:https://github.com/Carthage/Carthage/releases:

Carthage 目前最新版本是 0.9.3,下载 Carthage.pkg 包就可以,下载成功后,双击安装。

安装成功后,我们就可以在项目中配置 Cartfile 文件了,可以在我们项目的根目录中,使用任何一个你熟悉的文件编辑器,建立这个文件:

$ vim Cartfile

Cartfile 文件中,引入一个第三方库,比如 SwiftyJSON

github "SwiftyJSON/SwiftyJSON"

然后我们保存文件,回到命令行界面,再次输入命令:

$ carthage update

紧接着,Carthage 就会开始抓取并使用 xcodebuild 构建第三方库:

*** Cloning SwiftyJSON
*** Checking out SwiftyJSON at "2.3.0"
*** xcodebuild output can be found in /var/folders/08/sys7159s6zjfd52t3p35qrbc0000gq/T/carthage-xcodebuild.yqDOKU.log
*** Building scheme "SwiftyJSON OSX" in SwiftyJSON.xcworkspace
*** Building scheme "SwiftyJSON iOS" in SwiftyJSON.xcworkspace
*** Building scheme "SwiftyJSON watchOS" in SwiftyJSON.xcworkspace

update 操作完成后,会在项目的根目录中生成一个 Carthage 目录。这个目录中又包含了两个目录 BuildCheckout

Build 中存放的是构建好的 framework 包:

Checkouts 中存放的是签出的第三方库项目源文件:

接下来,我们回到项目设置,进入 General 选项卡,在最下方的 Linked Frameworks and Libraries 中,将 Carthage/Build/iOS 中的 framework 文件添加到项目中:

然后在 Build Phrases 中,点击左上角的 + 号,添加一个 New Run Script Phrase:

然后在脚本区域输入:

/usr/local/bin/carthage copy-frameworks

最后将 SwiftyJSON 的路径添加到 Input Files 中。

$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework

最终结果如下:

添加这个 Run Script 的作用是为了让运行时能够找到这个动态库。这点 Carthage 官方文档中没有太明确的说明。我实际的实验过,如果不添加这个 copy-frameworks 脚本,那么项目在运行的时候会因为找不到这个动态库而在启动的时候崩溃。

还可以将 Carthage 所集成的第三方库生成的符号文件添加到项目中,这样我们在调试的时候,就可以步入第三方库内部的代码啦。

具体步骤,还是进入 Build Phrases ,然后在右上角点击 New Copy Files Phrase,然后将 Carthage/Build/iOS 目录中的 SwiftyJSON.framework.dSYM 符号文件拖动进来:

这样,我们项目运行后,就可以在断点中步入 SwiftyJSON 内部的代码啦。

关于这个符号文件,还有一点大家要注意的,如果你使用的是 Xcode 7 以上的版本,有可能在加入了符号文件后,造成编译出错。那么可能是因为一个构建选项引起的。

这时,可以在 Build Settings 中,找到 Strip Debug Symbol During Copy 这个选项,确保这个选项的值设置为 NO

然后再重新编译,一般就可以正常通过了。这个编译选项是指定在 Copy 符号文件的时候是否对符号表进行处理,在新版的 Xcode 上这个选项默认是 YES 的,所以咱们需要把它设置为 NO。这个问题也是官方文档中没有提到的,我在调试的时候,遇到过这个问题,经过一番搜索才找到原因,困扰了我好半天~

好啦,经过一番折腾,我们通过 CarthageSwiftyJSON 库顺利的集成到项目中啦。

水平有限,这里也只是对 Carthage 进行了初步的介绍。希望借助这个文章,与大家进行一个交流分享,希望能够作为抛砖引玉,相信屏幕前的你有着更多的聪明才智,也欢迎大家一起讨论自己更深入研究的经验。

如果你读了这篇文章还意犹未尽的话,在我们的微信公众平台上还有更多关于包管理的讨论,关注公众号 "swift-cafe" 然后发送 "包管理" 即可查看。

CarthageGitHub 上的主页:https://github.com/Carthage/Carthage

Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验 | SwiftCafe 咖啡时光的更多相关文章

  1. 包管理工具Carthage使用

    iOS项目中第三方开源库的工具有Cocoapods和Carthage,swift官方出了一个包管理工具SPM(Swift Package Manager). 首先,大体讲一下Cocoapods和Car ...

  2. linux--多种包管理工具使用和区别(转)

    Linux包管理工具(转) 在正式进入讨论之前,先贴几条非常有用的link: linux 发行版比较:http://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1 ...

  3. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  4. Node包管理工具

    Node包管理工具 只是简单的介绍一些工具的使用,有利于开发过程.除了介绍Node包管理工具,还介绍了前端打包工具,前端模块管理工具 Node包管理工具:    --npm    --cnpm    ...

  5. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  6. 编码神器——Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

  7. NodeJS包管理工具——npm入门

    如今每个语言体系中都有一个包管理工具,PHP的Composer,Ruby的gem,Python的pip,Java的Maven……当然还有Node.js的npm.有的人会奇怪为何要引入又一个新东西来让我 ...

  8. MacOS上的包管理工具

    众所周知,Linux世界中存在着如apt-get.yum等强大而简单的包管理工具,而在Macos中同样存在类似的东西. 当前比较流行的主要有如下两种: 1.Homebrew(推荐):其官网地址brew ...

  9. 编码神器 Sublime Text 包管理工具及扩展大全

    Sublime Text 是程序员们公认的编码神奇,拥有漂亮的用户界面和强大的功能,例如代码缩略图,多重选择,快捷命令等.还可自定义键绑定,菜单和工具栏.Sublime Text 的主要功能包括:拼写 ...

随机推荐

  1. Mysql错误: ERROR 1205: Lock wait timeout exceeded解决办法(MySQL锁表、事物锁表的处理方法)

    Java执行一个SQL查询未提交,遇到1205错误. java.lang.Exception: ### Error updating database.  Cause: java.sql.SQLExc ...

  2. ios开发Base64编码以及加密相关学习

    一:.Base64补充 ```objc 1.Base64简单说明 描述:Base64可以成为密码学的基石,非常重要. 特点:可以将任意的二进制数据进行Base64编码 结果:所有的数据都能被编码为并只 ...

  3. 手动打war包进行部署测试

    有的时候项目跑不起来但是又不知道tomcat问题还是其他问题,往往新建个项目,打成war进行部署.今天找到个好方法,手动打成war,然后进行部署测试. image.png image.png 创建一个 ...

  4. Linux中LVM2原理及制作LVM2

    Linux中LVM2原理及制作LVM2 一.LVM原理 [MD]:Multi Device 多设备 Mdadm是一个用户空间工具,是RAID的管理工具,与真正的RAID工作没有太大关系.真正的RAID ...

  5. Springmvc+Shiro实战

    原文链接:http://blog.csdn.net/qq_37936542/article/details/79010449 springmvc+shiro实现系统粗细粒度的权限管理步骤: 1:表格设 ...

  6. Java-Maven项目引入UEditor图片上传组件jar包类库的5种方式

    最近,硬是和百度的UEditor组件杠上了.自己的个人官网项目,很容易就搞定了,公司的项目,尼玛,各种问题.项目多了,环境复杂了,解决问题的方法也得不断调整. 项目用Maven管理jar包,用到了UE ...

  7. 【codeforces 768B】Code For 1

    [题目链接]:http://codeforces.com/contest/768/problem/B [题意] 一开始给你一个数字n; 让你用这个数字n根据一定的规则生成序列; (如果新生成的序列里面 ...

  8. 利用WPF建立自己的3d gis软件(非axhost方式)(三)矢量数据显示控制

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(三)矢量数据显示控制 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew 密 ...

  9. POJ - 1466 Girls and Boys 二分图+最大独立集

    标题效果:有着n学生,有一些同学之间的特殊关系.. .为了一探究竟m学生.要求m免两者之间的学生有没有这样的特殊关系 解决问题的思路:二分图的问题,殊关系是对称的.所以能够将两个点集都设置为n个点.求 ...

  10. node assert模块 Study.1

    1.assert() 大体理解意思:assert可以抽象理解为node中的alert++ assert模块是Node的内置模块,用于断言的作用,如果不是自己想要的就抛出错误 assert(arg1, ...