Swift包管理工具

Swift的包管理工具有以下三个

swift-package-manager(推荐)

  1. Apple官方提供,采用Swift编写
  2. 采用swift-llbuild构建编译。swift-llbuild是一个并行、高效、增量编译的构建引擎,所以编译速度快,不会对不变的依赖进行重复编译。
  3. 支持跨平台,比如windows,linux,macOS,darwin。
  4. 支持executable类型,所以可以用来写命令行工具。
  5. 自动生成package.xcworkspace和并支持命令行生成.xcodeproj
  6. 采用了Swift作为配置描述语言,在Package.swift文件中进行配置,写起来更加清晰方便。
  7. 使用git tag来做版本依赖,格式上遵循Semantic Versioning。
  8. 去中心化,没有统一的管理中心,所以没有更新中心服务器文件索引的这种耗时步骤

Cocoadods

  1. 采用ruby编写
  2. 自动化/侵入性高:一键配置和集成依赖/自动更改 Xcode.project 的配置
  3. 自动建立和更新一个 Xcode workspace,用来管理项目和所有依赖。
  4. CocoaPods的工程目录必须有一个podspec文件,其中包含有关项目的元数据并指定了工程的的编译方式。
  5. 中心化,提供各个源管理仓库配置文件,所有更新仓库文件索引可能会很慢。

Carthage

  1. 采用Swift编写
  2. 通过xcodebuild将依赖库打包成framework,这样可以减少开发过程中的编译时间。
  3. Cartfile文件格式是基于OGDL(Ordered Graph Data Language)标准来组织的,这种格式支持3种类型的数据源:github和git、binary。
  4. 在 Xcode 里定位到源码不方便,是很麻烦,不方便调试。
  5. 因为Carthage去中心化,不修改xcodeproj,也不生成xcworkspace文件,所以需要手动引入依赖库,很繁琐。
  6. 去中心化


使用swift-package-manager(SPM)添加库

暂时并不推荐使用SPM,因为它还不够成熟,且资料也不多,现在使用它会可能踩很多坑,因此建议先继续使用Cocoadods


输入三方库的Git地址



选项详解:

Up to Next Major: 当前指定的版本号到下一个大版本号之间的最新版本,例如 2.0.0 ~ 3.0.0(不包含 3.0.0)

Up to Next Minor: 当前指定的版本号到下一个次版本号之间的最新版本,例如 2.0.0 ~ 2.1.0(不包含 2.1.0)

Range: 指定的两个版本号之间的最新版本,例如 2.1.0 ~ 2.7.2(不包含 2.7.2)

Exact: 指定使用某一具体的版本号



创建 Swift Package

创建自己的 Swift 包,有两种方式:

在 Xcode 中找到 File -> New -> Swift Package 即可进入创建流程。

Swift Package相当一个Swift项目,只是目录结构有所不同;项目结构大致如下:

  • Package.swift: 包的清单文件,用于描述包的名称、内容、依赖关系、支持的 Swift 版本号;
  • Sources: 源码文件夹,通常包括 C/C++ 代码和 Swift 代码等;
  • Tests: 单元测试代码

Package.swift 文件示例

import PackageDescription

let package = Package(
    name: "swift_package_demo",
    products: [
        .library(
            name: "swift_package_demo",
            targets: ["swift_package_demo"]),
    ],
    dependencies: [
        .package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", from: "3.0.0"),
    ],
    targets: [
        .target(
            name: "swift_package_demo",
            dependencies: []),
        .testTarget(
            name: "swift_package_demoTests",
            dependencies: ["swift_package_demo"]),
    ]
)

products:是 Package 编译后对外的产品输出,一般可分为两种类型:可执行文件、静态库或者动态库;其中.library("swift_package_demo") 配置了第三方 App 引用时,需要 import 的 module 名。比如:.library("demoPackage") ,在其他 App 中添加了这个 Package 后,使用 import demoPackage 即可。


dependencies:定义了当前 Package 依赖的第三方库


targets :是 Package 的基本构件,和 xcodeproject 一样,Package 可以有多个 targettarget 分为三种类型:常规型、测试类型、系统库类型。以 .target("swift_package_demo") 为例,程序会自动到 Source 文件夹里寻找名为 swift_package_demo 的文件夹,并把里面所有 public 属性作为接口开放出来。

Targets 的几个主要属性(详见:https://juejin.im/post/5df32bcc518825125a638456

  • name:名字
  • dependencies:依赖项,注意不要和上面的 Package.Dependency 搞混了,不是一个东西,这里可以依赖上面 Package.Dependency 的东西或者依赖另一个 target。所以这里只需要写 Package 或者 Target 的名字字符串(Target.Dependency 这个枚举也实现了 ExpressibleByStringLiteral)。
  • path:target 的路径,默认的话是 [PackageRoot]/Sources/[TargetName]
  • source:源文件路径,默认 TargetName 文件夹下都是源代码文件,会递归搜索
  • exclude:需要被排除在外的文件/文件夹,这些文件不会参与编译。
  • publicHeadersPath:C 家族库的公共头文件地址。
  • swiftSettings:定义一个用于特定环境(例如 Debug)的宏,需要设置的话可以去 API 上研究下
  • linkerSettings:用于链接一些系统库


使用 Xcode 测试Swift Package

编写Swift代码可以通过 VSCode、Atom 加入各种插件,甚至 txt 文本编辑器写;但是肯定还是 Xcode 用起来比较方便。

默认 swift build 是不会生成 packageName.xcodeproj 这种 Xcode 可以直接打开的工程文件,但是可以通过 swift package generate-xcodeproj 命令行生成一个 .xcodeproj 文件,然后就可以通过 Xcode 运行该项目了,如果需要配置什么环境变量,则需要通过 Build Setting 中的选项配。

需要注意的一点事,通过 swift run 和通过 Xcode 启动的是不同的进程,两种方式生成的可执行文件并不是同一个,所以如果需要把可执行文件更新到其他地方的时候注意别弄错了。


1> 确保xcode命令行配置正确:

2> 关闭Seift Package项目,从终端cd到Swift Package项目根目录下,执行命令生成 .xcodeproj 文件:

swift package generate-xcodeproj

3> 重新打开项目

在单元测试中就可以测试代码了




更多资料:https://juejin.im/post/5df32bcc518825125a638456

https://juejin.im/post/5e1864855188254c257c37c3




举报

© 著作权归作者所有


0