Tutorial de instalación, uso y solución de problemas comunes de Carthage

antecedentes

En el proceso de desarrollo de un proyecto, siempre necesita usar algunas bibliotecas de terceros. Si siempre arrastra manualmente el código fuente de la biblioteca de terceros al proyecto, es muy problemático, ineficiente, no elegante y es También es muy problemático actualizar la biblioteca de terceros. Por lo tanto, existen algunos software para administrar bibliotecas de terceros.Actualmente hay dos principales, CocoaPod y Carthage.

que es cartago

Carthage está escrito en lenguaje Swift y solo admite marcos dinámicos y herramientas de administración de dependencias de Cocoa para iOS8+. A diferencia de los populares CocoaPods, Carthage compila sus dependencias y proporciona los archivos .framework binarios del marco, pero aún conserva el control total sobre la estructura y la configuración de su proyecto. Carthage no modifica automáticamente los archivos del proyecto ni la configuración de compilación. es una herramienta de gestión de dependencia de Cocoa descentralizada.

La diferencia entre CocoaPod y Cartago

1. Cocoapods mejora la capacidad de mantenimiento y el compromiso de las bibliotecas de código abierto de terceros mediante la creación de un ecosistema más centralizado, mientras que Carthage enfatiza la delegación de tareas a Xcode y Git con la mayor flexibilidad posible.

2. Cocoapods creará y actualizará automáticamente el espacio de trabajo, las dependencias y los proyectos de Pod y los integrará en uso.

3. Carthage no necesita crear ni heredar el espacio de trabajo y el proyecto en uso correspondientes, y solo necesita confiar en el archivo de marco empaquetado.

4. El método de Cocoapods es más simple y fácil de usar, mientras que Carthage es más flexible y no intrusivo en el proyecto.

5. Un proyecto CocoaPods también debe tener un archivo Podspec que incluya metadatos sobre el proyecto e indique cómo construirlo.

6. Carthage se usa para las dependencias de compilación de Xcode, en lugar de integrarlas en un solo espacio de trabajo, no tiene un archivo de especificación similar.

7. Cocoapods tiene un almacén central, mientras que Cartago está descentralizado. Sin un servidor central, se evitan fallas que pueden ser causadas por errores del nodo central y se reduce el mantenimiento. Es decir, cada vez que Cartago configura y actualiza el entorno, solo para actualizar una biblioteca específica, el tiempo requerido es menor.

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

Supongo que te gusta

Origin juejin.im/post/7080416141004242980
Recomendado
Clasificación