Swift中Package Manager的使用

Swift中Package Manager的使用

一、Package文件构成

Swift Package Manager简称SPM是苹果官方为swift语言提供的强大的依赖管理工具。能够自动化地处理包的依赖下载、编译、链接和管理。

Products:在包中的每个target最终都可能构建成一个Library或者一个execute作为product,这是package编译后的产物,

Target:构建单元,包含一组源代码文件,可以是一个库,可执行文件等。可依赖其他目标,如library、executable。一个package可以包含多个target

Dependencies:package所依赖的其他package,SPM会自动下载并解析这些依赖,确保项目的所有库都能正确构建。

Tool Version:最低支持的Swift工具链版本。

二、SPM的优点

对比Cocoapods,SPM具有以下优点。

  • 无需安装,Xcode11以上版本自带
  • 苹果官方维护,不用担心和Cocoapods一样停止维护
  • 安装第三方库的时候比Cocoapods快(依赖源在github,有些要翻墙)
  • 使用SPM构建时比Cocoapods快

三、SPM缺点

  • 每次打开App 都会重新拉取 所有依赖的库
  • 更新时间长(访问github 还需要进行科学上网)
  • 支持文档少,
  • 远端仓库对网络要求高

四、创建Package的两种方式:

1、常用命令:
bash 复制代码
mkdir SwiftPackageTest # 生成的Package的名称
cd SwiftPackageTest
swift package init --type library       # 初始化库包
swift build                              # 构建
swift test                               # 运行测试
swift run <executable-target>            # 运行可执行目标
swift package resolve                    # 解析依赖
swift package update                     # 更新依赖
基本使用

通过命令可以快速

bash 复制代码
# 创建一个库包
swift package init --name MyLib --type library
​
# 创建一个可执行包
swift package init --name MyLib --type executable
​

这将在当前目录生成一个标准的库包结构:

复制代码
MyLib/
├── Sources/
│   └── MyLib/
│       └── MyLib.swift
├── Tests/
│   └── MyLibTests/
│       └── MyLibTests.swift
└── Package.swift
​

Package.swift清单文件的内容通常如下:

复制代码
MyLib.swift文件

Sources目录是实现代码的存放位置,MyLib.swift一般作为程序的入口,用于处理命令行参数并调用核心功能。

构建和测试

bash 复制代码
# 编译包
swift build
​
# 运行测试
swift test
​
# 运行包
swift run
​
2、使用Xcode界面创建

Xcode---> 工具栏File--->New--->Package--->Libary

五、Package的配置

less 复制代码
// swift-tools-version:6.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
​
let package = Package(
    name: "MyLib",
    platforms: [.iOS(.v18), .macOS(.v15)], // 指定包所支持的平台和最低版本
    products: [
        .library(name: "MyLib", targets: ["MyLib"]) // 指编译后的包,对外提供
    ],
    dependencies: [ // 声明此包所依赖的外部包
        .package(url: "https://github.com/Alamofire/Alamofire.git", from: "5.8.0")
    ],
    targets: [ // 定义包的相关信息
        .target(
            name: "MyLib",
            dependencies: ["Alamofire"],
            resources: [.process("Resources")]
        ),
        .testTarget(
            name: "MyLibTests",
            dependencies: ["MyLib"]
        )
    ]
)
​
  • name: Swift包的名字,或者' nil '使用包的Git URL来推断名字。

  • defaultLocalization:资源的默认本地化。

  • platforms:具有自定义部署目标的受支持平台列表。

    • 支持的平台和对应的系统版本
    • platforms:[
    • .macOS(.v11), .iOS(.v12),.tvOS(.v12)
    • ]
  • pkgConfig: C模块的名称。如果存在,Swift包管理器会搜索 <名称>。获取系统目标所需的附加标志。

  • providers:系统目标的包提供程序。

  • products:此包提供给客户使用的产品列表。

    编译后的产物一般分为两种 可执行文件 静态库或动态库

  • dependencies:包依赖列表。
  • 添加依赖的包,一般指向包源的git路径和版本环境,或者包依赖的本地路径

  • 依赖包的添加支持以下五种方式

    • git源 + 确定的版本号
    • git源 + 版本区间
    • git源 + commit号
    • git源 + 分支名
    • 本地路径
less 复制代码
.package(url: "https://github.com/Alamofire/Alamofire.git", .exact("1.2.3")),
.package(url:"https://github.com/Alamofire/Alamofire.git", .branch("master")),
.package(url:"https://github.com/Alamofire/Alamofire.git", from: "1.2.3"),
.package(url:"https://github.com/Alamofire/Alamofire.git",.revision("e74b07278b926c9ec6f9643455ea00d1ce04a021"),
.package(url: "https://github.com/Alamofire/Alamofire.git", "1.2.3"..."4.1.3"),
.package(path: "../Foo"),
  • targets:作为这个包的一部分的目标列表。
  • target是Package的基本构建,和xcodeproject一样,Package可以有多个target

  • target分为三种类型

    • 常规性 .regular
    • 测试类型 .test
    • 系统库类型 .system
  • swiftLanguageModes:此包兼容的Swift语言模式列表。

六、在Xcode中导入包

  1. 在Xcode中打开你的项目。
  2. 选择菜单栏的File > Add Packages...。
  3. 在弹出的窗口中,选择Add Local添加本地的package,或输入包存在的网址。
  4. 选择完成后,点击Add Package,Xcode会自动解析并下载该包及其所有依赖项。
  5. 依赖的包会出现在项目导航器的Package Dependencies部分,然后可以在代码中直接import使用。

在Xcode中删除包 如果在Xcode中导入包后,无法在Package Dependencies部分删除包,可以在项目.xcodeproj包内内容下的project.pbxproj里进行包的删除,删除后保存文件即可。

参考:juejin.cn/post/743693...

相关推荐
1024小神7 小时前
使用AVFoundation实现二维码识别的角点坐标和区域
开发语言·数码相机·ios·swift
0xAaron1 天前
如何使用dSYM文件来符号化崩溃信息
ios·swift·调试·崩溃·符号化·dsym
Swift社区1 天前
在 Swift 中使用 Image Playground 生成 AI 图像:完整实战指南
开发语言·人工智能·swift
0xAaron1 天前
ips 文件符号化
ios·swift·调试·ips·符号化
HarderCoder1 天前
脱离 SwiftUI 也能用 @Observable:深入理解 withObservationTracking 的玩法、坑点与 Swift 6 突围
swift
kk哥88992 天前
Swift底层原理学习笔记
笔记·学习·swift
confiself2 天前
通义灵码分析ms-swift框架中CHORD算法实现
开发语言·算法·swift
1024小神2 天前
在 Swift 中,self. 的使用遵循明确的规则
开发语言·ios·swift
Swift社区2 天前
Swift 类型系统升级:当协议遇上不可拷贝的类型
开发语言·ios·swift