2019独角兽企业重金招聘Python工程师标准>>>
Carthage是什么?
Carthage创建的是去中心化的依赖管理器。
说到Carthage,就要先说swift,2014年苹果发布swift初期,用swift编写的第三方库就只能通过拖动源代码到自己的项目中才能被调用, 由于当时只有寥寥无几的开源库,且不能打包,加上swift1.0并不是那么好用,许多人对swift持着观望的态度。随着swift逐步趋于稳定,并且从ios8.0开始支持将自己写的swift打包成framework,越来越多的纯swift编写框架开始出现,就在这时候carthage突然出现在人们的视野中,而且陆陆续续几乎所有的开源框架都开始支持carthage。
Carthage的目标是用最简单的方式来管理Cocoa第三方框架。
Carthage也是一个比较好用的三方框架管理工具,原理是自动帮你把工程编译为Dynamic framework(动态库),仅支持iOS8以上,相比Cocoa pods对项目更无侵入性。
更多Carthage详细请见:https://github.com/Carthage/Carthage.git
Carthage与CocoaPods的区别
CocoaPods是已存在很长时间的Cocoa依赖管理器,那么为什么要创建Carthage呢?
首先,CocoaPods默认会自动创建并更新你的应用程序和所有依赖的Xcode workspace。Carthage使用xcodebuild来编译框架的二进制文件,但如何集成它们将交由用户自己判断。CocoaPods的方法更易于使用,但Carthage更灵活并且是非侵入性的。
个人觉得,配置更是简单,使用的时候项目干干净净,所有的第三方库就像苹果原生的framework一样美好,从此你不再需要担新CocoaPods的库用不了,不用花大量时间去修复用CocoaPods打包时出现的各种问题,如果你用过CocoaPods,当你开始用Carthage的时候,你很有可能会爱上它。
安装Carthage
安装方式:
- 方式一:可以使用Homebrew来安装Carthage,比较快捷一些
安装Carthage之前,需要先安装Homebrew,在终端输入命令如下:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装完homebrew后,执行下面命令
$ brew update
$ brew install carthage
- 方式二:还可以从网站 https://github.com/Carthage/Carthage/releases下载最新版的 Carthage.pkg 来更新。
当你安装好Carthage后,在终端执行:
kinglydeMacBook-Pro:~ kingly$ carthage version
0.26.2
kinglydeMacBook-Pro:~ kingly$
即可看到当前的carthage版本,我的Carthage的版本为0.26.2。
现在,你已经安装好了Carthage,接下来就是在你的项目中使用carthage了。
使用Carthage
使用步骤:
- 创建一个Cartfile,将你想要使用的框架列在里面。
- 运行carthage update --platform iOS,将获取依赖文件到一个Carthage.checkout文件夹,然后编译每个依赖。
- 在你的应用程序target的“General”设置标签中的“Embedded Binaries”区域,将框架从Carthage.build文件夹拖拽进去。
创建一个Cartfile,添加框架
首先,切换你的项目所在的路径。执行如下命令:
$ vi Cartfile
加入你想要使用的框架,如下:
github "SwiftyJSON/SwiftyJSON" ~> 3.0
github "kingly09/KYMenu" == 0.0.6
~> 3.0 表示使用版本3.0以上但是低于4.0的最新版本,如3.5, 3.9
== 3.0 表示使用3.0版本
= 3.0表示使用3.0或更高的版本
如果你没有指明版本号,则会自动使用最新的版本
使用 :wq! 保存Cartfile成功,
此时你的项目文件夹里会创建一个名为Cartfile的文件
运行 carthage update --platform iOS 下载和编译所需要的第三方库
$ carthage update --platform iOS
Carthage会为你下载和编译所需要的第三方库,当命令执行完毕,在你的项目文件夹中会创建一个名为Carthage的文件夹和Cartfile.resolved,如下所示。
kinglydeMacBook-Pro:MenuDemo kingly$ carthage update --platform iOS
*** Fetching SwiftyJSON
*** Fetching KYMenu
*** Checking out SwiftyJSON at "3.1.4"
*** Checking out KYMenu at "0.0.6"
*** xcodebuild output can be found in /var/folders/lz/1g92dn0x7w98kpc4yt8f2qrc0000gn/T/carthage-xcodebuild.8NQpHy.log
*** Building scheme "KYMenu" in KYMenuDemo.xcodeproj
*** Building scheme "SwiftyJSON iOS" in SwiftyJSON.xcworkspace
kinglydeMacBook-Pro:MenuDemo kingly$
kinglydeMacBook-Pro:MenuDemo kingly$ ls -l
total 16
-rw-r--r-- 1 kingly staff 26 11 3 14:49 Cartfile
-rw-r--r--@ 1 kingly staff 33 11 3 14:49 Cartfile.resolved
drwxr-xr-x 5 kingly staff 170 11 3 14:50 Carthage
drwxr-xr-x 10 kingly staff 340 11 3 14:56 MenuDemo
drwxr-xr-x 6 kingly staff 204 11 3 14:55 MenuDemo.xcodeproj
drwxr-xr-x 4 kingly staff 136 11 3 12:45 MenuDemoTests
drwxr-xr-x 4 kingly staff 136 11 3 12:45 MenuDemoUITests
kinglydeMacBook-Pro:MenuDemo kingly$
在 /Users/kingly/Documents/项目/demo/MenuDemo/Carthage/Build/iOS 里会出现xxx.framework文件已经为你创建好了。
注意Carthage只支持动态框架,而后者只存在于iOS 8以上(以及任意版本的OS X)。
设置标签中的“Embedded Binaries”区域
如果是 OC
安装好后只需要在对应 Target 中的 Build Setting 中的 Framework Search Path 项加入以下路径
$(SRCROOT)/Carthage/Build/iOS
即可。
如果是 swift,必须导入
现在打开你的项目,点击project,选择target, 再选择上方的General,将需要的framework文件拖到 Linked frameworks and Binaries内
如下所示:
目的是告诉Xcode链接你的app到这个framework,允许你在代码中使用。
点击Build Phrase tab选项,添加相应的run script
并添加以下命令:
/usr/local/bin/carthage copy-frameworks
carthage copy-frameworks命令剔除了额外的框架。
点击Input Files下面的+号为每一个framework添加条目。
$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework
$(SRCROOT)/Carthage/Build/iOS/KYMenu.framework
编译项目
在需要使用框架的地方导入对应的框架, command + B 编译项目即可
严格来讲,build phase对项目运行来说不是必须的,但是,这巧妙的解决了APP因为使用的frameworks包含二进制图像的iOS模拟器在提交APP Store时会被自动拒绝的问题。
更新 Carthage
使用如下命令即可:
carthage update --platform iOS
如果只更新某一个框架,使用命令
carthage update KYMenu --platform iOS
现在,就开始享受Carthage了
常见问题
1)出现 Reason: image not found
dyld: Library not loaded: @rpath/KYMenu.framework/KYMenu
Referenced from: /var/containers/Bundle/Application/C3E607DA-217A-4432-A035-F14FE1C79D45/MyTest.app/MyTestApp
Reason: image not found
第一种解决方法:
1、在Xcode中的Build Phases中的Copy Files项中,将你要引用的framework拖到“Linked
Frameworks and Libraries“中【如果已经添加了,跳过这一步】
2、把Build Phases 里Social.framework后边的选项修改成为Optional就可以了。
注意:第一种方式可以解决编译时的报错,但有时候我们在使用库里的方法时不能正确的执行。
第二种解决方法:
在你的应用程序target的“General”设置标签中的“Embedded Binaries”区域,点击“+”号,把动态库添加进来。
如图所示:
2) 加快 Carthage Copy Framework 的速度
加速的过程很简单,只需要在原有的 Xcode 的 Carthage Copy Framework 里面,在原本空白的 Output Files 处,加入对应的 $(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/XXX.framework 就可以了。
更多Carthage
请见 https://github.com/Carthage/Carthage