カーセージのインストール、使用、および一般的な問題解決のチュートリアル

バックグラウンド

プロジェクトを開発する過程で、常にいくつかのサードパーティライブラリを使用する必要があります。サードパーティライブラリのソースコードを常に手動でプロジェクトにドラッグすると、非常に面倒で非効率的で、エレガントではなく、また、サードパーティのライブラリをアップグレードするのは非常に面倒です。したがって、サードパーティのライブラリを管理するためのソフトウェアがいくつかあります。現在、CocoaPodとCarthageの2つの主流のものがあります。

カルタゴとは

CarthageはSwift言語で記述されており、iOS8以降の動的フレームワークとCocoa依存関係管理ツールのみをサポートします。人気のあるCocoaPodsとは異なり、Carthageは依存関係をコンパイルし、フレームワークのバイナリ.frameworkファイルを提供しますが、プロジェクトの構造と設定を完全に制御できます。Carthageはプロジェクトファイルやビルド設定を自動的に変更しません。分散型Cocoa依存関係管理ツールです。

CocoaPodとCarthageの違い

1. Cocoapodsは、より集中化されたエコシステムを作成することにより、サードパーティのオープンソースライブラリの保守性とエンゲージメントを向上させます。一方、Carthageは、タスクをXcodeとGitに可能な限り柔軟に委任することを強調します。

2. Cocoapodsは、ワークスペース、依存関係、ポッドプロジェクトを自動的に作成および更新し、それらを使用中に統合します。

3. Carthageは、使用中の対応するワークスペースとプロジェクトを作成して継承する必要はなく、パッケージ化されたフレームワークファイルのみに依存する必要があります。

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

おすすめ

転載: juejin.im/post/7080416141004242980