Carthage:去中心化的Cocoa依赖管理器

Cocoa的依赖管理器,我们已经有了CocoaPods,非常好用,那么为什么还要创建这样一个项目呢?本文翻译自Carthage的Github的README.md,带大家来了解一下这个工具有何不同之处。
Carthage的目标是用最简单的方式来管理Cocoa第三方框架。
基本的工作流如下:
创建一个Cartfile,包含你希望在项目中使用的框架的列表
运行Carthage,将会获取列出的框架并编译它们
将编译完成的
.framework二进制文件拖拽到你的Xcode项目当中
Carthage编译你的依赖,并提供框架的二进制文件,但你仍然保留对项目的结构和设置的完整控制。Carthage不会自动的修改你的项目文件或编译设置。
Carthage与CocoaPods的不同
CocoaPods是已存在很长时间的Cocoa依赖管理器,那么为什么要创建Carthage呢?
首先,CocoaPods默认会自动创建并更新你的应用程序和所有依赖的Xcode workspace。Carthage使用xcodebuild来编译框架的二进制文件,但如何集成它们将交由用户自己判断。CocoaPods的方法更易于使用,但Carthage更灵活并且是非侵入性的。
CocoaPods的目标在它的README文件描述如下:
…为提高第三方开源库的可见性和参与度,创建一个更中心化的生态系统。
与之对照,Carthage创建的是去中心化的依赖管理器。它没有总项目的列表,这能够减少维护工作并且避免任何中心化带来的问题(如中央服务器宕机)。不过,这样也有一些缺点,就是项目的发现将更困难,用户将依赖于Github的趋势页面或者类似的代码库来寻找项目。
CocoaPods项目同时还必须包含一个podspec文件,里面是项目的一些元数据,以及确定项目的编译方式。Carthage使用xcodebuild来编译依赖,而不是将他们集成进一个workspace,因此无需类似的设定文件。不过依赖需要包含自己的Xcode工程文件来描述如何编译。
最后,我们创建Carthage的原因是想要一种尽可能简单的工具——一个只关心本职工作的依赖管理器,而不是取代部分Xcode的功能,或者需要 让框架作者做一些额外的工作。CocoaPods提供的一些特性很棒,但由于附加的复杂性,它们将不会被包含在Carthage当中。
安装Carthage
Carthage提供OS X平台的pkg安装文件,你可以从Github的最新release中找到,按照引导一步步安装即可。
如果你想安装最新的开发版本(可能存在稳定性和兼容性的问题),你只需要clone本仓库的master分支,然后运行make install.
添加框架到应用程序
安装完Carthage后,你能够使用它来添加框架到你的项目。注意Carthage只支持动态框架,而后者只存在于iOS 8以上(以及任意版本的OS X)。
开始使用:
创建一个Cartfile,将你想要使用的框架列在里面
运行
carthage update,将获取依赖文件到一个Carthage.checkout文件夹,然后编译每个依赖在你的应用程序target的“General”设置标签中的“Embedded Binaries”区域,将框架从
Carthage.build文件夹拖拽进去。
在这个过程当中,Carthage将创建一些build artifacts,其中最重要的是Cartfile.lock文件,里面将列出每个框架的具体版本,确保你提交了这个文件到版本控制工具里面(如Git、SVN),因为每个用到项目的人都需要它来编译相同版本的框架。
完成上面的步骤并提交你的修改,项目的其他用户就只需要获取该仓库并执行carthage bootstrap就能使用你所添加的框架。
添加框架到单元测试或另一个框架
使用Carthage添加框架到任意目标的方法,和添加到应用程序差不多。主要的不同在于框架是如何设置并链接到Xcode的。
因为非应用程序目标没有“Embedded Binaries”设置区域,你需要将编译完成后的框架拖拽到“Link Binaries With Libraries”的区域里。
在某些稀有案例中,你也许会想要复制每个依赖到已编译的项目中(比如,在外部框架中嵌入依赖,或确保依赖在测试工具中正常显示)。想要达到这个目的,你需要创建一个新的“Copy Files”编译选项和“Frameworks”组,然后将框架的引用添加到里面。
升级框架
如果你改动了你的Cartfile,或者你想升级到框架的最新版本(服从于你指定的需求版本),执行carthage update命令可以达到目的。
让你的框架支持Carthage
Carthage只正式支持动态框架,动态框架能够在任何版本的OS X上使用,但只能在iOS 8及以上版本使用。
因为Carthage拥有非中心化的包列表,以及没有项目指定的编译设置,大多数框架应该能自动编译。
分享你的Xcode schemes
Carthage将只从你的.xcodeproj中标记为已分享的Xcode schemes来编译。如果你想检查编译是否成功,执行carthage build --no-skip-current命令,然后检查Carthage.build文件夹。
如果当执行命令但有scheme没有被编译,打开Xcode并确定对应scheme被标记为“Shared”,以便Carthage能够发现它。
解决编译失败
如果你在执行carthage build --no-skip-current时编译失败,尝试执行xcodebuild -scheme SCHEME -workspace WORKSPACE build 或xcodebuild -scheme SCHEME -project PROJECT build(将其中的大写单词换成你项目的对应名称),然后观察是否有相同的失败发生,这应该能生成足够的失败信息来解决问题。
稳定版发布的标签
Carthage使用语义化标签来发布稳定版本。如1.2.0,如带有字母则是不受支持的版本(如1.2-alpha-1).
CarthageKit
大多数carthage命令行工具的功能都封装在一个名为CarthageKit的框架中。
如果你希望将Carthage作为另一个工具的一部分,或者希望扩展Carthage的功能,可以看看CarthageKit的源码,检查API是否符合你的需求。
授权协议
Carthage使用MIT开源协议授权发布。
Carthage:去中心化的Cocoa依赖管理器的更多相关文章
- Carthage - 一个简单、去集中化的Cocoa依赖管理器
作为一名新时代的90后猿 在swift大势所趋的时候 怎能不会Carthage 配置它其实很简单 下面我们一步一步来 (1)打开你的终端 输入 brew update brew install c ...
- buckaroo 去中心化的c++包管理工具
buckaroo 是一款去中心化的c++ 包管理工具,使用上,类似yarn(nodejs),cargo (rust) ,使用buckaroo 我们可以很容易集成一个大规模的项目 支持以下特性 直接从G ...
- webpack的require.context()实现路由“去中心化”管理
最近在开发一个大型vue单页面应用的时候,项目最初是将所有的路由写在一个router.js的文件里. const router = new Router({ mode: "history&q ...
- ImCash:币安下架BSV之辩:规则、中立与去中心化
一种看法是:一个引用价格数据和执行交易的加密货币交易所,其业务决策往往是在链外发生的,不受制于严格的.类似于准宪法的链上规则的约束,加密货币交易所可以拒绝任何人喜欢的价格和交易,而且这样做并不会损害底 ...
- 谈互联网开放平台:“去中心化”大势所趋 zz
文/磐石之心 几天前与好友聊到众筹咖啡馆的事情,他向我讲述了一个非常具有特色的众筹咖啡馆案例.而这个案例也引发我对当前互联网开放.去中心和集权的一些思考,今天就简单写出来与大家分享. 一个无赚钱目的的 ...
- Filecoin:一种去中心化的存储网络(二)
开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...
- Filecoin:一种去中心化的存储网络(一)
开始初步了解学习Filecoin,如下是看白皮书的内容整理. 参考: 白皮书中文版 http://chainx.org/paper/index/index/id/13.html 白皮书英文版 http ...
- serf 中去中心化系统的原理和实现
原文:https://www.infoq.cn/article/principle-and-impleme-of-de-centering-system-in-serf serf 是出自 Hashic ...
- uuid 去中心化的唯一性
A Universally Unique IDentifier (UUID) URN Namespace https://tools.ietf.org/html/rfc4122.html A UUID ...
随机推荐
- luogu P1195 口袋的天空
题目背景 小杉坐在教室里,透过口袋一样的窗户看口袋一样的天空. 有很多云飘在那里,看起来很漂亮,小杉想摘下那样美的几朵云,做成棉花糖. 题目描述 给你云朵的个数N,再给你M个关系,表示哪些云朵可以连在 ...
- Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和
下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...
- DQL数据查询语言——连接查询
--内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.b ...
- 16个Linux服务器监控命令
在不同的Linux发行版中,会有不同的GUI程序可以显示各种系统信息,比如SUSE linux发行版中,就有非常棒的图形化的配置和管理工具YaST,KDE桌面环境里的KDE System Guard也 ...
- Mysql_SQL_常用知识点&实践
1.Mysql中类似于nvl()函数的ifnull()函数 ) FROM Table 2.添加某个字段(指定字段column的位置) ----------添加字段zoneId ) NOT NULL A ...
- 转: 由socket的accept说开去
from: http://ticktick.blog.51cto.com/823160/779866 今天与同学争执一个话题:由于socket的accept函数在有客户端连接的时候产生了新的socke ...
- Error:[$parse:lexerr]
1.错误描写叙述 2.错误原因 由错误提示可知,有关AngularJS代码不符合语法,导致报错 3.解决的方法 检查发现,title标签中的data-ng-bind属性使用方法有误 <title ...
- EffectiveJava(13)使类和成员的可访问性最小化
1.为什么要使类和成员可访问性最小化 它可以有效地解除组成系统的各模块之间的耦合关系,使得这些模块可以独立的开发 测试 优化 使用 理解和修改.提高软件的可重用性 2.成员的访问级别 私有(priva ...
- Android 6.0及以上版本号的执行时权限介绍
执行时权限(Runtime Permission)是Android 6.0( 代号为 Marshmallow,API版本号为 23)及以上版本号新增的功能.相比于以往版本号,这是一个较大变化. 本文将 ...
- js 导入json配置文件
import AA from './menu.json' console.log(AA) 匹配好路径