常见的依赖管理器优缺点对比

CocoaPods

优点

  • 支持大量的第三方库。
  • 简单易用的命令行界面。
  • 自动处理库的依赖关系。

缺点

  • 可能会遇到一些与 CocoaPods 本身或第三方库的兼容性问题。
  • 可能会导致项目构建速度变慢。

Carthage

优点

  • 支持多种平台,包括 iOS、macOS 和 tvOS。
  • 可以选择使用二进制文件或源代码构建库。
  • 不会在项目中引入额外的依赖。

缺点

  • 需要手动处理库的依赖关系。
  • 可能需要更多的时间来设置和构建项目。

Swift Package Manager

优点

  • 是 Apple 官方提供的工具,与 Xcode 深度集成。
  • 支持 Swift 和 Objective-C 库。
  • 可以通过源代码或二进制文件管理库。

缺点

  • 相对较新,可能不支持某些较旧的库。
  • 依赖管理功能相对较弱。

Cocoapods

基础使用

最新版安装流程

  1. (首次安装)移除现有Ruby默认源

  2. (首次安装)使用新的源

  3. (首次安装)验证新源是否替换成功

  4. (可选)更新 gem

  5. 安装 CocoaPods

Podfile 文件中的一些写法

# 设置镜像源
source 'https://cdn.cocoapods.org/'
# 忽略警告
inhibit_all_warnings!

消除 Pod 版本过低的警告

post_install do |installer|
# 如果第三方库最低支持版本低于13,就改为13(消除xcode警告)
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 13.0
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
end
end
end
# ... 也可以做一些其它的操作
end

同理也可以批量对其它字段进行修改,用法很灵活。

发布和使用私有 Pod 库

发布私有 podspec

创建一个私有 Specs 仓库

你需要在 GitHub 或其他 Git 托管服务上创建一个私有仓库,用于存储你的 Podspecs。

创建 Podspec

在你的项目根目录下创建一个新文件,名为 YourPod.podspec,其中 YourPod 是你的 Pod 的名称。在这个文件中,你需要填写 Pod 的相关信息,例如名称、版本、作者、源代码等。

注册私有 Specs 仓库

在终端中运行以下命令,将你的私有 Specs 仓库添加到 CocoaPods 的源列表中:

pod repo add YourRepoName https://github.com/YourGitHubAccountName/YourSpecsRepo.git

如果是公司内部使用,也可以使用内部的 git 仓库。

验证 Podspec

在终端中运行以下命令,验证你的 Podspec 是否有效:

如果一切正常,你应该看到类似以下的输出:
YourPod.podspec passed validation.
推送 Podspec

在终端中运行以下命令,将你的 Podspec 推送到你的私有Specs 仓库中:

pod repo push YourRepoName YourPod.podspec

这将把你的 Podspec 上传到你的私有Specs 仓库中。

你需要通过适当的权限设置确保私有 Specs 仓库对团队内部可见,否则其他团队成员无法使用。

使用方法

在你的项目中,你可以使用 CocoaPods 来引入你的私有 Pod。在你的 Podfile 中添加以下内容:

pod 'YourPod', :podspec => 'https://github.com/YourGitHubAccountName/YourSpecsRepo.git'

然后,在终端中运行以下命令,安装你的私有 Pod:

如何使用本地的 Pod 库

流程和私有 Pod 库相似,但是省略掉了发布过程,Specs 文件放置在某个本地目录就可以。这种方式一般用于本地调试或者通过 git submodule 来引用库。

发布开源库到 CocoaPods 官方平台

准备工作

1. clone 远程仓库到本地
git clone 你的仓库链接
2. 注册 trunk

注册的命令

pod trunk register 你的邮箱 你的用户名

记得去邮箱里验证,然后可以输入以下命令查看个人信息

pod trunk me

步骤

1. 创建 .podspec
pod spec create AXKit
2. 修改 .podspec 并验证

有很多类似的教程,可以参考。

一个小技巧:你可以去GItHub搜索一些热门的第三方库,然后点击查看这些大牛的 .podspec 是怎么写的。
传送门:YYKit的podspecReactiveObjC的podspecBlocksKit的podspec

最容易出错的地方就是资源路径

s.source_files = "AXKit/**/*.{h,m}"

常见写法

"Directory1/*"  表示匹配所有文件
"Directory1/Directory2/*.{h,m}" 表示匹配所有以.h和.m结尾的文件
"Directory1/**/*.h" 表示匹配所有子目录

s.source 常见写法

# 推荐写法:与版本号绑定
s.source = { :git => "https://github.com/TeaseTian/HTQRCode.git", :tag => "#{s.version}" }
# 与commit id 绑定
s.source = { :git => "https://github.com/TeaseTian/HTQRCode.git", :commit => "68defea" }

tag => s.version 表示将这个 Pod 版本与 Git 仓库中相同版本的 comit 绑定

注意

如果仓库中对应的tag是 “v1.0.0” 这样以字母开头的,可以在 #{s.version} 前面加上对应的字母。commit => “68defea” 表示将这个 Pod 版本与 Git 仓库中某个 commit 绑定

验证

pod spec lint AXKit.podspec
3. 上传到远程仓库

修改 .podspec 时指定的版本号,如 0.0.1。那么远程仓库中必须始终存在这个版本的 branchtag 才能够下载。建议使用 tag。s.source 中的 tag 需要与远程仓库中的 tag 对应起来。

s.version = "0.0.1"
s.source = { :git => "https://github.com/xaoxuu/AXKit.git", :tag => "v#{s.version}" }

这里指向的是 "v0.0.1" 这个分支,因为分支我们用完之后习惯把它删掉,所以这里也可以指向 tag,也就是说打一个 "v0.0.1" 的 tag 并推送到远程就可以了。

git tag v0.0.1
git push --tags

这样做的好处就是删掉当前分支不影响 CocoaPods 中指向的仓库源码。

4. 发布到 CocoaPods
pod trunk push AXKit.podspec
n. 删除一个 podspec 版本

删除的命令是:

pod trunk delete 项目名 版本号

官方建议使用 deprecate 来弃用

pod trunk deprecate 项目名

这两种方法执行完有很大几率会出现一串很长很长的错误,不要着急,这实际上这是一个 html。把它保存到一个 html 文件中,打开,是个404错误页,原因众所周知。

删除之后立即搜索还是能搜到的,因为有一定的延迟,可能要半个小时才能更新。

pod trunk 命令

在终端输入

pod trunk --help

可以查看帮助

使用脚本

没必要每次都重复每个步骤,如果你已经发布过一个,可以省去注册的步骤,直接把已经发不过的 podspec 复制一份,改一下仓库模块名,验证通过就可以发布了。

我写了一个便于发布更新的脚本,把脚本放在与 podspec 同级目录下,当你更新了项目之后,如果需要更新到 cocoapods,可以执行此脚本。流程是:

输入版本号 -> commit、push tag -> pod spec lint -> 询问是否发布(y/n) -> 发布(y)

Swift Package Manager

创建 Package

按照下面操作创建:

  • 菜单入口:File -> New -> Package
  • 快捷键: + + + N

项目根目录下会有一个名为 Package.swift 的文件,该文件描述了你的项目的依赖项和设置。> API 文档

如何增加 ObjC 代码

和 Swift 大致相似,但是需要开放的头文件需要放在 include 文件夹中,文件路径参考如下:

Sources/MyLibrary/xxx.swift
Sources/MyLibrary/include/xxx.h
Sources/MyLibrary/xxx.m

增加图片等素材

以开源库 ProHUD 为例:

// swift-tools-version:5.6

import PackageDescription

let package = Package(
name: "ProHUD",
platforms: [.iOS(.v13)],
products: [
.library(name: "ProHUD", targets: ["ProHUD"]),
],
dependencies: [
.package(url: "https://github.com/SnapKit/SnapKit.git", "5.0.0" ..< "6.0.0"),
],
targets: [
.target(
name: "ProHUD",
dependencies: ["SnapKit"],
resources: [.process("Resources/ProHUD.xcassets")]
)
]
)

相应的 xcassets 文件路径是:

Sources/ProHUD/Resources/ProHUD.xcassets

为了使用方便,可以封装一下:

extension UIImage {
public convenience init?(inProHUD named: String) {
self.init(named: named, in: .module, with: .none)
}
}

如何引用静态库

有时候我们为了提高构建效率,会发布和使用二进制化的静态库:

// swift-tools-version: 5.9
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
name: "MyPackage",
platforms: [.iOS(.v13), .macOS(.v11)],
products: [
// Products define the executables and libraries a package produces, making them visible to other packages.
.library(
name: "MyBinaryLibrary",
targets: ["MyBinaryLibrary"]),
],
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
.binaryTarget(
name: "MyBinaryLibrary",
path: "path/to/MyBinaryLibrary.xcframework"
),
]
)