关于Carthage的小知识

什么是Carthage

Carthage和CocoaPods都是用来管理第三方库,与CocoaPods相比Carthage更加轻量一些,它是由Swift编写的,所以在纯Swift项目中更为便利

A simple, decentralized dependency manager for Cocoa
一个简单、松散的依赖管理者
这个是Carthage Github上的描述

简单对比Carthage与Cocoapods

  • Carthage用xcodebuild 构建框架(framework)的二进制文件,但是并没有将他们整合到用户项目中。Cocoapods的目的是让用户使用起来更简单,而 Carthage 则是更灵活,减少对项目的侵入性
  • Cocoapods项目还必须具有所谓的podspec文件,其中包括有关项目的元数据,并指定应如何构建它。Carthage使用xcodebuild去构建依赖,而不是将它们集成到单个工作区中,它没有类似的规范文件,但你的依赖项必须包含到自己的 Xcode 项目中,该项目描述了如何构建其产品

安装Carthage

  • 安装Homebrew
    • 如果你已经安装了可以跳过这一步
    • 更新最新版本
    • 如果你没有安装,可以参考这里Mac 安装homebrew并更新到最新版本
brew update

如果遇到Error: The /usr/local directory is not writable.错误,就执行以下命令sudo chown -R $(whoami):admin /usr/local再更新

  • 安装Carthage
brew install carthage
  • 查看Carthage版本
carthage version

在项目中使用Carthage

  • 进入项目所在文件夹
  • 创建Cartfile文件
  • 打开Cartfile文件
  • 编辑Cartfile文件,添加依赖库
cd 项目文件夹路径
touch Cartfile
open Cartfile
github "Alamofire/Alamofire" == 4.5
git "https://enterprise.local/desktop/git-error-translations2.git"
binary "/absolute/path/MyFramework.json"

Cartfile文件

  • 格式
    • 使用 github 关键字指定 GitHub 存储库(GitHub.com 和 GitHub Enterprise)
    • 其他 git 存储库使用 git 关键字指定
    • 仅作为已编译的二进制文件 .frameworks 提供的依赖项使用 binary 关键字和 https:// 链接,file:// 链接,或没有方案的相对或绝对路径,返回二进制项目规范
  • 版本要求
    • >= 1.0 指“1.0 及以上版本”。
    • ~> 1.0 指“1.x 版本”
    • == 1.0 指“版本为 1.0”
    • "some-branch-or-tag-or-commit" 特指 git 对象(git rev-parse 任何内容都被允许)。
      Note:二进制源 不支持这种形式。
      如果没有指定任何版本,任何版本的依赖都将被允许(默认使用最新版本)。
  • 保存关闭Cartfile,运行Carthage
carthage update --platform iOS

运行命令后,一个叫Cartfile.resolved的文件将会被创建到 Cartfile 同级目录下。此文件准确指定了每个依赖项选择的版本,并列出了所有依赖项(甚至是嵌套的版本)。

Cartfile.resolved.png

强烈建议将该文件加入到版本控制中,告知其他开发者,当前使用的版本。

虽然 Cartfile.resolved 文件是人类可读和可扩展的,但你不能修改它。文件的格式非常严格,列出依赖项的顺序对于构建过程很重要。

Carthage 文件夹

  • Build
    包含对应平台编译好的Framework
  • Checkouts
    包含编译 framework 所使用的源代码(除非你使用 submodules ,否则不要修改这里的代码,carthage updatecarthage checkout 会覆盖这里的代码,清除你的修改)。

在"Carthage/Build/iOS"文件夹中会生成 .framework 文件。

在项目中使用Carthage

  • 在Carthage -> Build中找到需要的framework
  • 将framework拖拽到Xcode 工程的Linked Frameworks and Libraries
  • 进入工程的 target -> Build Phases,点击 +,添加New Run Script Phase输入一下脚本
/usr/local/bin/carthage copy-frameworks

在 Input Files 下添加要使用的框架的路径

$(SRCROOT)/Carthage/Build/iOS/XXXX.framework

将复制框架的路径添加到 Output Files

$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/XXX.framework
  • 为什么需要指定 Output Files
    • 使用 Carthage 来管理第三方库,在编译并运行 App 的时候,会有一个阶段叫:Carthage Copy Frameworks。这个阶段通过跑一个脚本的形式把所有依赖的第三方库都复制到 App 的目录里。

    • 这个阶段通常会花 1~x 秒不等,这取决于你的 App 依赖的第三方库数量。默认情况下,每次你 Build & Run 的时候,都会进行一次这个操作——尽管你的第三方库没有任何改变。

    • 所以我们需要指定 Output Files,在 Output Files 指定输出文件的情况下,Xcode 只会在 framework 发生更改时去进行 copy framework 操作,这样就节省了时间。

更新库

1、在carthage文件里面把有指定版本的库更新到想要的版本,如无指定版本可忽略
2、调用命令更新库

  • 全部更新
carthage update --platform iOS
  • 更新制定库
carthage update XXX --platform iOS


最后的话

虽然说Carthage是纯Swift编写,但个人感觉还是觉得CocoaPods更加便利快捷,特别是在国内。
在实际项目中Carthage升级或加库经常各种报错,有可能是本人学艺未精,经过万般折腾,本人还是会首选CocoaPods作为第三方库管理工具



参考文章
Carthage 新手教程
版权所有,如需转载请联系作者并注明出处

你可能感兴趣的:(关于Carthage的小知识)