Carthage安装、使用及常见问题解决教程

背景

开发项目过程中, 总是需要用到一些第三方库, 如果总是手动将第三方库源码拖进工程, 很麻烦, 效率低, 不够优雅, 而且要升级第三方库也很麻烦。因此出现了一些管理第三方库的软件,目前主流的有两个, 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存在的一些缺陷:

扫描二维码关注公众号,回复: 13755148 查看本文章

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
复制代码

猜你喜欢

转载自juejin.im/post/7080416141004242980