Tutoriel d'installation, d'utilisation et de résolution de problèmes courants de Carthage

Contexte

Dans le processus de développement d'un projet, vous devez toujours utiliser des bibliothèques tierces. Si vous faites toujours glisser manuellement le code source de la bibliothèque tierce dans le projet, c'est très gênant, inefficace, pas élégant, et c'est également très gênant pour mettre à niveau la bibliothèque tierce. Il existe donc des logiciels de gestion de librairies tierces, il en existe actuellement deux grand public, CocoaPod et Carthage.

C'est quoi Carthage

Carthage est écrit en langage Swift et ne prend en charge que les frameworks dynamiques et les outils de gestion des dépendances Cocoa pour iOS8+. Contrairement aux CocoaPods populaires, Carthage compile vos dépendances et fournit les fichiers binaires du framework .framework, mais vous gardez toujours un contrôle total sur la structure et les paramètres de votre projet. Carthage ne modifie pas automatiquement les fichiers de votre projet ou les paramètres de construction. est un outil décentralisé de gestion des dépendances Cocoa.

La différence entre CocoaPod et Carthage

1. Cocoapods améliore la maintenabilité et l'engagement des bibliothèques open source tierces en créant un écosystème plus centralisé, tandis que Carthage met l'accent sur la délégation des tâches à Xcode et Git de la manière la plus flexible possible.

2. Cocoapods créera et mettra automatiquement à jour l'espace de travail, les dépendances et les projets Pod et les intégrera en cours d'utilisation.

3. Carthage n'a pas besoin de créer et d'hériter de l'espace de travail et du projet correspondants en cours d'utilisation, et doit uniquement s'appuyer sur le fichier de structure empaqueté.

4. La méthode Cocoapods est plus simple et plus facile à utiliser, tandis que Carthage est plus flexible et non intrusive pour le projet.

5. Un projet CocoaPods doit également avoir un fichier Podspec qui inclut des métadonnées sur le projet et indique comment le construire.

6. Carthage est utilisé pour les dépendances de construction Xcode, au lieu de les intégrer dans un seul espace de travail, il n'a pas de fichier de spécification similaire.

7. Cocoapods dispose d'un entrepôt central, tandis que Carthage est décentralisé. Sans serveur central, les pannes pouvant être causées par des erreurs de nœud central sont évitées et la maintenance est réduite. Autrement dit, chaque fois que Carthage configure et met à jour l'environnement, uniquement Pour mettre à jour une bibliothèque spécifique, le temps nécessaire est plus court.

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

Je suppose que tu aimes

Origine juejin.im/post/7080416141004242980
conseillé
Classement