布景
开发项目过程中, 总是需求用到一些第三方库, 假如总是手动将第三方库源码拖进工程, 很麻烦, 功率低, 不够优雅, 而且要升级第三方库也很麻烦。因此出现了一些办理第三方库的软件,现在主流的有两个, CocoaPod和Carthage。
什么是Carthage
Carthage运用Swift言语编写,只支撑动态框架,只支撑 iOS8+的Cocoa依靠办理工具。 与现在盛行的 CocoaPods 不同,Carthage编译你的依靠,并供给框架的二进制.framework文件,但你仍然保存对项意图结构和设置的完整控制,Carthage不会主动的修正你的项目文件或编译设置。是一个去中心化的Cocoa依靠办理工具。
CocoaPod和Carthage的区别
1、Cocoapods经过创立一个更集中的生态系统来进步第三方开源库的可保护性和参与度,而Carthage强调尽可能灵活的将使命委托给Xcode和Git。
2、Cocoapods在运用中会主动创立和更新workspace、依靠和Pod项目并进行整合。
3、Carthage在运用中不需求创立和承继相应的workspace和project,只需求依靠打包好的framework文件即可。
4、Cocoapods的办法愈加简略粗犷容易运用,而Carthage则更灵活且对项目没有侵入性。
5、CocoaPods项目还有必要具有Podspec文件,其中包括有关该项意图元数据,并指出如何构建它。
6、Carthage用于Xcode构建依靠关系,而不是将它们集成到单个作业空间中,它没有相似的规范文件。
7、Cocoapods有一个中心库房,而Carthage是去中心化的,没有中心服务器也就避免了可能因中心节点过错而带来的失败,也减少了保护,即Carthage每次配置和更新环境,只会去更新具体的库,所需时间更短。
关于CocoaPod的装置和运用, 能够看之前写的这篇文章 CocoaPods装置、运用及常见问题解决
Carthage存在的一些缺点:
1、支撑Carthage的第三方库仍然不如CocoaPods丰富;
2、仅支撑iOS 8.0+;
3、在运用的过程中无法检查第三方库源码。
Carthage装置
装置Homebrew
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
假如报错 Failed to connect to raw.githubusercontent.com port 443: Connection refused 装置不了
先履行
sudo gem install redis
然后从头装置Homebrew
仍是装置不了的话, 就换源, 运用国内源
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
更新Homebrew(可选)
每次运用Homebrew进行装置Carthage或者其他软件之前,习惯性的先对Homebrew进行更新一下, 否则可能会装置到比较老版别的Carthage等软件
brew update
假如提示:
则履行
brew upgrade
装置Carthage
brew install carthage
创立Cartfile文件
cd 到项目根目录下, 履行
touch Cartfile
增加依靠的第三方库
现在只支撑GitHub库(GitHub.com和GitHub企业),指定GitHub的关键字
# 有必要5.x版别 (大于或等于 5.0 ,小于 6.0)
github "SnapKit/SnapKit" ~> 5.0.0
# 最低2.3.1版别
github "ReactiveCocoa/ReactiveCocoa" >= 2.3.1
# 有必要0.4.1版别
github "jspahrsummers/libextobjc" == 0.4.1
# 运用最新版别
github "jspahrsummers/xcconfigs"
# 运用git分支
github "jspahrsummers/xcconfigs" "branch"
# 运用一个企业项目
github "https://enterprise.local/ghe/desktop/git-error-translations"
# 运用一个私有项目,在 "development" 分支
git "https://enterprise.local/desktop/git-error-translations2.git" "development"
# 运用一个本地的项目
git "file:///directory/to/project" "branch"
装置第三方库
carthage update
只编译iOS渠道的类库
carthage update --platform iOS
内部作业流程即 carthage update => carthage checkout => checkout build
假如报错: Building universal frameworks with common architectures is not possible. The device and simulator slices for “SnapKit” both build for: arm64
根据提示, 增加–use-xcframeworks参数
carthage update --platform iOS --use-xcframeworks
本地目录如下
履行完carthage update指令后,会生成一个Cartfile.resoved的文件和一个Carthage的文件夹。
这个.resolved的文件与CocoaPods中的lock文件功用一致,都是用来锁版别的。而这个Carthage文件夹下存放的便是Carthage为咱们供给的动态库framework。
Carthage运用
项目中引进framework(不太推荐, 推荐运用下面的xcframework)
找到咱们工程对应的Targets, 然后找到Build Phases下方的 +号下方的New Run Script Phase, 来增加引进framework的相关脚本。
脚本如下
/usr/local/bin/Carthage copy-frameworks
一起在Input Files里边增加对应的第三方库的framework, 即将Carthage/Build/iOS目录下编译生成的framework途径增加进去
$(SRCROOT)/Carthage/Build/iOS/SnapKit.framework
运行, 可是报错: /usr/local/bin/carthage: No such file or directory, 检查了本地途径下, 的确没有carthage
可是终端却显示已经装置了
无法, 只能去github上找pkg装置包 github.com/Carthage/Ca…
装置成功后, 再检查/usr/local/bin/, 就有carthage了
然后从头运行项目, 报错 Could not find module ‘SnapKit’ for target ‘arm64-apple-ios-simulator’; found: armv7-apple-ios, arm64-apple-ios, at: /Users/xxx/Desktop/FrameworkDemo/ZQKitDemo/Carthage/Build/iOS/SnapKit.framework/Modules/SnapKit.swiftmodule
原因分析
Xcode12之前, 编译模拟器静态库支撑i386 x86_64两架构, 编译真机静态库支撑armv7 arm64两架构。而Xcode12之后编译的模拟器静态库也支撑了arm64, 项目是用Xcode13.3版别创立的, 所以有必要去除模拟器静态库中的arm64
解决办法
修正工程设置, 让模拟器下不再包括arm64
能够成功运行了, 运用时经过import xxxx导入就能运用
项目中引进xcframework(推荐)
xcframework是苹果官⽅推荐的、⽀持的,能够更⽅便的表明⼀个多个渠道和架构的分发⼆进制库的格式。需求Xcode11以上⽀持。是为更好的⽀持Mac Catalyst(用于 iPad)和ARM芯⽚的macOS。专⻔在2019年提出的framework的另⼀种先进格式。
XCFramework和传统的framework相⽐的三个长处
1 能够⽤单个.xcframework⽂件供给多个渠道的分发⼆进制⽂件。
2 与Fat Header相⽐,能够依照渠道区分,能够包括相同架构的不同渠道的⽂件。
3 在使⽤时,不需求再经过脚本去剥离不需求的架构体系。
架构常识补充
iOS/iPad:arm64
iOS/iPad Simulator:x86_64 arm64
Mac Catalyst: x86_64 arm64
Mac: x86_64 arm64
具体操作如下, 只需求导入 XCFramework即可, 注意挑选Embed & sign, 无需写脚本
更新第三方库
# 更新所有的第三方库
carthage update
# 只更新SnapKit 和 Moya这两个第三方库
carthage update SnapKit Moya