【转】Carthage的安装和使用

Carthage

Carthage 是一个较新的 Cocoa 开发第三方套件管理工具,相较于知名 CocoaPods 管理工具的複杂配置,轻巧的 Carthage 在推出之后广受 Swift 社群喜爱。

本文基于 Carthage 0.20: Unary, Binary, Ternary

特色

  • 时代潮流:Written in Swift! (v.s. CocoaPods in Ruby)
  • 主流现代:iOS 8+, dynamic framework only
  • 去中心化:无提供类似 cocoapods、npm 这种中心储存库。
  • 非入侵式:不会修改 Xcode 相关配置,耦合性低。

快速上手

  1. 从终端环境安装 Carthage
brew install carthage

如果还没有装 homebrew,请来这下载

  1. 建立一个 Carfile,列出欲使用的模组,例如:
github "Alamofire/Alamofire" ~> 4.4
github "ReactiveX/RxSwift" ~> 3.0
  1. 在终端环境输入 carthage update,Carthage 将自动下载所有相依模组至 Carthage/Checkouts 资料夹中,并编译成 frameworks(或直接下载 pre-compiled framework)。
  2. Carthage/Build 资料夹内编译好的 frameworks 拖拉进你的 app target => General => Linked Frameworks and Libraries
  3. app target => Build Phases 下新增一个 New Run Script Phase
# 自动将 framework 複製到 target app 的 bundle中
/usr/local/bin/carthage copy-frameworks

并在 Input Files 加入相依的 frameworks 路径,例如:

$(SRCROOT)/Carthage/Build/iOS/Alamofire.framework
$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework

Cartfile 版号语法简介

Cartfile 版号语法与 Podfile 雷同:

# 版号 >= 3.1.2
github "ReactiveX/RxSwift" >= 3.1.2

# 版号 3.x (3.0 <= ver < 4.0)
github "SnapKit/SnapKit" ~> 3.0

# 仅匹配版号 0.4.1
github "jspahrsummers/libextobjc" == 0.4.1

# 最新版
github "jspahrsummers/xcconfigs"

# 指定 Git branch
github "jspahrsummers/xcconfigs" "branch"

# 其他 Git Server Repository 的 develop 分支
git "https://agitserver.com/swift-test/swift-test.git" "develop"

# 本地 local Git Repository
git "file:///directory/to/project" "branch"

常见议题

Q:Carthage 资料夹裡面究竟有啥?

Carthage/
├── Build/
│   ├── iOS/
│   │   ├── Alamofire.framework
│   │   ├── Alamofire.framework.dSYM
│   │   ├── SnapKit.framework
│   │   └── SnapKit.framework.dSYM
│   └── macOS/
│       └── ... macOS 等其他平台 的 framework
└── Checkouts/
    ├── Alamofire/
    │   ├── ... Alamofire clone 下来的原始码
    └── SnapKit/
        └── ... SnapKit clone 下来的原始码
  • Carthage/Build: 打包好的 framework(pre-built 或是从 checkouts build 出来的)
  • Carthage/Checkouts: 所有相依模组的 source code

Q:如何避免 carthage udpate 取得的模组版号不同?

Carthage 提供一个锁定文件 Cartfile.resolved,记录了当前被确切安装的模组精确版号。每次更动新增相依模组时,Cartfile.resolved 即会自动更新。可预防部分模组版号没有完全遵循 语意化版本(SEMVER) 时产生的问题。

建议将 Cartfile.resolved 提交至版本管理系统中。之后将远端储存库 clone 下来,只需要执行

carthage bootstrap

就可以取得与提交时版号完全相同的模组了。

Q:我不想提交 Carthage 资料夹到 Git Server,怎办?

一般而言,我们会将 Carthage 加入 Project 的 .gitignore 中:

# within .gitignore
Carthage

除非另有需求,不然 Cartfile.resolve 应足以还原 project 与提交时相同版号的模组环境。

Q:我需要开发用但非 Project 相关的模组,该如何?

Carthage 提供另一个 Cartfile.private,配置方法与 Cartfile 相同。Cartfile.private 内的相依模组不会被作为主模组的 dependency。可用来配置开发用模组,譬如使用 testing framework。

Q:如何只提供 binary framework,不开放 source code?

Carthage 提供的来源除了 Git 以外,事实上最近才提供 binary 这个选项。

Cartfile 范例如下:

binary "https://example.com/release/ExampleFramework.json" ~> 1.4.0

这裡的 json 档应描述该 framework 对应版号的下载路径,配置范例如下:

{
    "1.3.5": "https://example.com/release/1.3.5/framework.zip",
    "1.4.3": "https://example.com/release/1.4.3/framework.tar.gz"
}

除此之外,目前只接受 https url 连结,且 version 只能对应语意化版本, Git branch/tag/commit 都暂时无法使用。

Q:如何同时修改相依模组的 code,并在 Run 时同步更新吗?

可以,请新增一个 Run Script build phase,在 Run App 后会自动 build 新的 framework:

/usr/local/bin/carthage build --platform "$PLATFORM_NAME" --project-directory "$SRCROOT"

!!!!!注意!!!!!

所有在 Carthage/checkouts 内的 source 随时可能改变。如果确定需要改动相依模组,请利用 carthage 指令将相依模组加入 Git submodules

carthage update --use-submodules
# or
carthage checkout --use-submodules

之后就可以直接操作 Git submodules 了!

原文地址

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容