Cocoa包管理器之Carthage详解及CocoaPods中心化+Carthage的二进制化

上篇博客详细的聊了CocoaPods的相关内容,今天咱们就来介绍另外一个Cocoa的包管理器Carthage。在上家公司用Swift开发工程时,用的就是Carthage。Carthage诞生于14年11月份,是用Swift语言开发的,相对于CocoaPods来讲是一个新生事物。本篇博客主要介绍一下Carthage的使用姿式,接下来几篇博客会介绍一下Carthage的源代码,看一下其工做原理。本篇博客咱们会先介绍Carthage的按照和使用,而后再看一下Carthage额工做原理,而后再将本身的库关联到Carthage,最后来对比一下CocoaPods。html

首先咱们来看一下Carthage的官方介绍:Carthage的初衷是以最简单的方式来为你的Cocoa应用添加framework。Carthage将你依赖的三方库编译成二进制的framework,而后再提供给你使用。可是对你的工程结构有着完整的控制权。Carthage不会自动的修改你的工程文件或者编译设置。git

Carthage is intended to be the simplest way to add frameworks to your Cocoa application.Carthage builds your dependencies and provides you with binary frameworks, but you retain full control over your project structure and setup. Carthage does not automatically modify your project files or your build settings.github

 

 

1、Carthage的安装和使用xcode

一、Carthage的安装app

Carthage的安装是比较简单的,经过brew就能够直接安装,命令以下:框架

brew install carthageide

  

 

 

二、Carthage的使用-carthage update工具

 Carthage中管理依赖的文件为Carfile,咱们能够建立一个名为Cartfile的文件来容纳咱们工程中所依赖的三方库。以下所示下方的Cartfile中依赖了一个AFNetWorking库和一个并无支持Carthage的私有库。在Cartfile文件中,咱们以github来直接指定该库在github上的域名path。添加完Cartfile文件后,接下来咱们经过下方的命令进行安装便可。网站

carthage updateui

在执行上述命令时咱们看到,对于“MyCocoaPodsTestProject”这个依赖仓库提示“该仓库没有被分享的framework schemes”, 稍后咱们将会对“MyCocoaPodsTestProject”这个仓库添加shared framerwork schemes。

  

 

执行完carthage update命令后,会生成一个Cartfile.resoved的文件和一个Carthage的文件夹。这个.resolved的文件与CocoaPods中的lock文件功能一致,都是用来锁版本的。而这个Carthage文件夹下存放的就是Carthage为咱们提供的动态库framework。 

  

 

三、工程中引入framework

接下来要作的就是把Carthage生成的相应依赖库的framework引入到咱们的工程中。首先找到咱们工程对应的Targets, 而后找到Build Phases下方的 ➕号下方的New Run Script Phase, 来添加引入framework的相关脚本。

  

 

下方是刚刚添加的Run Script,稍后会进行配置。

  

 

在Shell下方配置上carthage的命令路径以及相关的运行命令的参数,以下所示:

/usr/local/bin/carthage copy-frameworks

  

  

配置完相关的运行脚本后,在Link Binary With Libraries中添加或者拖入生成的三方库便可。 

  

 

  

 

 拖入完毕后,接下来咱们就能够直接使用了。

  

 

 

2、本身的仓库关联Carthage

从上面Carthage update时提示的错误咱们不难发现要想支持Carthage, 咱们的git仓库中必须有一个能够生成framework的Project,而且该Project开启了Scheme的分享功能。接下来咱们就让上述的 MyCocoaPodsTestProject工程支持Carthage的update。

 

一、建立 framework project

首先在咱们工程所对应的github目录下方建立一个Cocoa Touche Framework的工程。以下所示:

  

 

二、引入源代码

而后在这个framework工程中引入相关的源文件。

  

 

在引入相关的源文件后,在Build Phasea中的Header中的Public中添加对外暴露的头文件,以下所示:

  

 在相关的.h文件中引入该framework所提供的相关头文件,此处相似pch文件的设置。

  

 

若是你建立的framework的Project的名字与你预期的不一样,能够在Build Settings中的Product Name中进行设置,以下所示: 

  

 

二、shared schemes

接下来就该设置Scheme的Share了,首先打开Manager Schemes…以下所示:

  

  

 而后在Shared后方打钩便可。

  

 

三、framework的编译

使用终端进入到该工程目录中,使用carthage进行编译:

carthage build -no-skip-current

  

 

在我编译的时候遇到了上述的错误,不过Carthage的github主页给出了相关的解决方案,即便用xcodebuild进行编译,以下所示:

  

 使用上述命令编译 结果以下所示:

   

 

使用xcodebuild编译后,咱们又使用carhage build --no-skip-current试了一次,能够正常编译

  

 

进行编译后,建立相关的tag而后push到远端便可。 

  

 

而后咱们就能够在Carthage中正常使用咱们的库了。

   

 

在引用相关库的时候须要添加上其库名,以下所示:

   

 

 

 

3、carthage编译

由于Carthage工程是Swift编写的,而且是使用Carthage进行的依赖管理。 咱们能够从github上Clone相关的代码,而后执行carthage update进行依赖库的加载,以下所示:

  

 

加载完毕后,咱们就能够正常编译运行了,下篇博客会介绍Chathage的相关源代码的设计结构。

  

 

 

 

4、Carthage VS CocoaPods

二者各有各的好处,也各有各的缺点,下方是Carthage的README中给出的与CocoaPods的不一样之处。

  

下边是根据上面的英文本身翻译了一下:

CocoaPods是一个长期在Cocoa项目中使用的包管理工具,但为何还要去建立一个Carthage呢?

 

首先,CocoaPods默认是会为你的工程自动建立和更新一个Xcode工做空间,而且还会建立和更新全部的依赖(备注:安装pod后会建立一个xxxxxx.xcworkspec的文件,经过该文件能够打开Xcode工做空间,该工做空间除了你本身的project外,在Pods中还会引入其依赖的三方库的源代码)。而Carthage与其不一样,其会使用xcodebuild工具将依赖的库编译成二进制的framework, 可是整合这个framework的责任就落到了用户的身上。浸入式的CocoaPods使用起来会更为容易一些,而非浸入式的Carthage使用起来则更为灵活。

 

下方是CocoaPods的README中列举的目标之一:

  • 经过建立更集中的生态系统,提升第三方开源库的可发现性和参与度。

 

相比之下,Chathages是分散式依赖管理器。没有集中的依赖清单(就是内个CocoaPods中的SPEC仓库),这减小了维护工做,避免了任何中心故障点。然而,开源项目的发现变得更加困难,用户必须在github等开源网站上进行自行搜索。

 

CocoaPods的工程目录中必须有一个叫作podspec的这么一个文件,其中包含有关项目的元数据并指定了工程的的编译方式。Carthage使用了xcodebuild工具来构建依赖关系,而不是将这些依赖集成到单个工做区域中。它没有相似podspec这样的文件,但你的依赖项必须包括它们本身的XCODE项目,在这些项目中提供了依赖库的编译规则。

 

最终,咱们建立了Carthage,由于咱们想要最简单的工具——该依赖性管理器,它在不承担Xcode所作的工做的的状况下完成本身依赖管理的工做,而且不为框架做者建立额外的工做。虽然CocoaPods提供了许多使人惊喜的特性,但Carthage将永远不会有,由于这样会以增长工具的复杂度为代价。

 

 

5、CocoaPods结合Cathage进行二进制化。

不过咱们能够将二者结合起来,好比一个浩大的工程中引入了成百上千个依赖库,若是都以源码的形式加载的话,编译成本不免会比较大。咱们能够在CocoaPods中加载Carthage生成的framework, 来达到CocoaPods的二进制化的目的。

咱们能够在CocoaPods的Podfile中添加相关的定义,具体以下所示。在else的语句块中就是加载Carthage编译的framework。

  

 

添加完相关Pod配置后,咱们能够pod install看医生相关的库是否顺利的加载进来了。

  

 

下方就是咱们pod install后相关的内容,能够看到依赖的仓库经过了framework的形式被引入到了咱们的CocoaPods中,而且能够正常使用。

  

 

咱们能够经过指定SOURCE条件来切换源码加载。

  

 

下方是切换源码加载后的工程文件,能够看出是与以前一致的:

  

 

今天的博客就先到这儿吧,之后有机会的话再一块儿看一下Carthage的源码。

相关文章
相关标签/搜索