Carthage 是 iOS/Mac 开发生态圈的一个包管理工具,与现在流行的 CocoaPods 不同,它是一个去中心化的解决方案。知道它已经有一段时间了,但是一直没有好好玩过,今天整合 Carthage 并自己创建 Carthage 兼容的 Framework 的过程中让我有了很大的体会,决定写篇文字记录一下。

先来简单介绍下 CocoaPods,这是现在注流的 iOS/Mac 的包管理工具,当前最新版本是 0.37.2,已经支持 iOS Frameworks。它管理着共 10,822 个库(并在不断增长),可以让开发者非常容易地将一个第三方库集成进来。

经过一段时间的使用,我觉得 CocoaPods 有如下优势:

  • 使用方便,除编写 Podfile 以外其他几乎都是自动完成;
  • 软件包数量多,主流支持;
  • 支持 iOS 8 Framework,当然也支持旧的静态编译;

但是 CocoaPods 作为一个有中心仓库的解决方案,缺点也比较明显:

  • 每次更新环境都需要连接到中心仓库,比较耗时;
  • 开发者使用比较简单,但是如果创建兼容 CocoaPods  的库,就会相对繁琐一些(尽管有了命令行);
  • 每次干净编译都会把所有第三方库都重新编译一次(看似很正确,直到我遇见 Carthage…)

看到这里你已经知道 Carthage 的一个优势了,没错,使用 Carthage 的话,所有的第三方库依赖,除非是更新的需要,不然平常干净编译 Project,它是不需要再次编译的,大大加快平常编译及 Archive 的时间。每次 Archive 及干净编译时都能节省几十秒以上,还是非常可观的,光是冲的这点,Carthage 就值得使用。

那么,Carthage 还有什么优势呢?前面还提到了,它是去中心化的,没有中心服务器,这意味着每次配置和更新环境,只会去更新具体的库,而不会有一个向中心服务器获取最新库的索引这么个过程,如此一来,又省了很多时间。

「好了好了,如果还有第三个优势,我就被你说服,开始用 Carthage!」

第三个优势就是:与 CocoaPods 无缝集成!

「什么?一个项目使用两套包管理工具,不会出差错吗?」

经过我的亲自试验,我已经非常完美地将我的「奇点」项目改造成了 Carthage + CocoaPods 共同管理依赖这么一个配置。没有丝毫冲突。

因为 Carthage 并不是像 CocoaPods 那样一个全自动+全功能的第三方库配置工具,它的设计哲学是,完成琐碎的部分,并把主要控制权交给开发者,它不会像 CocoaPods 那样一定会生成一个 Workspace,这意味着我可以自由地去控制 Framework 如何放进我的 Project/Workspace,是 Required 还是 Optional。当我发现 Carthage 是如此灵活后,我毫不犹豫地在当前 CocoaPods 管理主要 Framework 的配置下,将少量其他 Framework
交给了 Carthage 管理。它们非常和谐地共存着。

事实上,我用 Carthage 还有一个主要原因,那就是创建第三方库并让 Carthage 可以使用实在是太简单了,不需要弄像 CocoaPods 那样结构复杂+声明文件式的模式,我只需要创建一个 Project/Framework,让 Framework 这个 Scheme 设置成 Shared 就可以了。这样,我的第三方库的目录非常干净,没有任何与 Carthage 有关的文件,Carthage 却能去发现并使用它,我就喜欢这样简单纯粹的技术解决方案。

以上,便是 Carthage 的第四个优势:结构标准的项目天然就是 Carthage 库。

列举完这四大 Carthage 优势后,来谈谈它的不足:

  • 库依然不如 CocoaPods 丰富:尽管很多库不需要声明并改造就直接可以被 Carthage 用,但依然有大量 CocoaPods 能用的库不支持,我相信时间能解决这个问题;
  • 只支持 Framework,所以是 iOS 8 Only 了,随着时间推移,这个也不会是问题;
  • 工具仍不完善:在使用过程中,我发现它无法在一个结构复杂的项目中正确发现库(比如有 iOS, Mac demo + framework 的结构);
  • 无法在 Xcode 里定位到源码:如果你在写代码过程中,想跳转到一个第三方库去看具体的实现,这是无法办到的,Carthage 的配置只能让你看到一个库的头文件;

不知道这四个劣势到底会在什么时候得到解决(第四个因项目配置原因我觉得是无法解决了),但是综合上面提到的四大优势,Carthage 的使用还是让我省时又省力了。

Carthage&&cocopads 摘抄笔记的更多相关文章

  1. 一些关于three.js的摘抄笔记

    加载多个geometry的方式: (可以利用three.js自带convert_obj_three.py文件将obj文件转换成json文件) function loadModel() { loader ...

  2. JS - Promise使用详解--摘抄笔记

    第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...

  3. Jenkins配置有用摘抄笔记

    使用jenkins配置.net mvc5网站自动构建全过程记录  转自:http://www.cnblogs.com/baiyunchen/p/4724350.html 持续集成是个简单重复劳动,人来 ...

  4. java学习摘抄笔记mybaits1

    mybatis 第一天 mybatis的基础知识 课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开发) ...

  5. java学习摘抄笔记mybaits2

    mybatis第二天  高级映射 查询缓存 和spring整合 课程复习: mybatis是什么? mybatis是一人持久层框架,mybatis是一个不完全的ORM框架.sql语句需要程序员自己去编 ...

  6. ajax学习摘抄笔记

    2019独角兽企业重金招聘Python工程师标准>>> AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). A ...

  7. git学习笔记01-git最基本的工作原理分布式

    git学习的网站 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000  --廖雪峰老师 ...

  8. linux 笔试题

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来 ...

  9. dll return a string

    char g_szText[1024]; __declspec(dllexport) const char * __stdcall FuncName(const unsigned char *p) { ...

随机推荐

  1. Memcached源码分析——slab的初始化

    以下内容仅为本人的笔记. /** * Determines the chunk sizes and initializes the slab class descriptors * according ...

  2. mongodb教程二

    MongoDB 创建数据库: MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 如果你想查看所有数据库,可以使用  ...

  3. 【转载51CTO】Linux中引号那些事儿

    原文链接:http://os.51cto.com/art/201207/348855.htm 我们将把编写脚本的事情暂时搁在一边,然后来讨论一些,我们一直在用的,但是没有解释的东西.引号在这一节里面, ...

  4. VS中的预先生成事件和后期生成事件

    原文:VS中的预先生成事件和后期生成事件 在C#开发中,有时候需要在程序编译之前或之后做一些操作. 要达到这个目的,可以使用Visual Studio中的预先生成事件和后期生成事件. 下图是一个简单例 ...

  5. Spring Boot + Elasticsearch

    spring data elasticsearch elasticsearch 2.0.0.RELEASE 2.2.0 1.4.0.M1 1.7.3 1.3.0.RELEASE 1.5.2 1.2.0 ...

  6. Configure swagger with spring boot

    If you haven’t starting working with spring boot yet, you will quickly find that it pulls out all th ...

  7. BZOJ1524: [POI2006]Pal

    1524: [POI2006]Pal Time Limit: 5 Sec  Memory Limit: 357 MBSubmit: 308  Solved: 101[Submit][Status] D ...

  8. 【UIView与控件】

  9. Python中利用xpath解析HTML

    在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxml.html的xpath对html进行分析 ...

  10. Exception starting filter struts2 java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor

    按教程,使用Convention插件进行配置 教程中说只要加入struts2-convention-plugin-2.3.4.1.jar这个jar包就可以使用. 按照这种方法部署后,启动tomcat报 ...