Swift Package Manager - 教你如何让自己的库支持SPM依赖

文章目录

  • 前言
  • 创建 Swift Package 库
    • 初始化 Swift Package 项目
      • 命令行初始化
      • 使用 Xcode 初始化
    • 编写库代码
    • 上传库到云端
    • 项目进行依赖
    • 依赖成功
    • 测试依赖
    • 库中, 依赖别的第三方
  • Package.swift 简介
  • SPM OC
  • 待解决问题
    • Authentication failed
    • 库不会更新到最新

前言

系列目录

  1. Swift Package Manager - 基础篇(教你 iOS 项目, 如何用 SPM 依赖第三方)
  2. Swift Package Manager - 教你如何让自己的库支持SPM依赖

上一篇 已经写了如何让自己的项目, 通过 SPM 依赖第三方.
那现在有个问题, 自己如何去创建一个支持 Swift Package 的库呢? 那么接下来, 我们就来探索如何把自己的库支持 SPM 吧!

创建 Swift Package 库

和以往一样, 一步一步来!

初始化 Swift Package 项目

命令行初始化

创建 XQPackageTest 文件夹, 然后打开终端 cd 到该文件夹下, 输入

swift package init    

然后控制台显示如下
那么就表示, 当前已经初始化好一个最基础的库了

Creating library package: XQPackageTest
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/XQPackageTest/XQPackageTest.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/XQPackageTestTests/
Creating Tests/XQPackageTestTests/XQPackageTestTests.swift
Creating Tests/XQPackageTestTests/XCTestManifests.swift

文件目录如下 ( .gi 是我后面自己加上的 )
Swift Package Manager - 教你如何让自己的库支持SPM依赖_第1张图片

里面的文件, 其实我们要关心的, 一般就两个

  • Package.swift: 是描述库的一些配置, 属性等等, 可以当做 CocoaPods 的 xxx.podspec 文件. (这个后面再详细描述, 现在默认配置就行)
  • Source/xxx 文件夹: 放源码的文件夹, 我们直接把源码扔到这个文件夹下就可以了

使用 Xcode 初始化

当然,Xcode 也提供了创建 Swift Package 入口, 如下图

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第2张图片

编写库代码

这里就直接拿系统生成的 XQPackageTest.swift 更改一下代码, 方便依赖成功后, 测试一下是否真的成功了。

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第3张图片

然后 command + build 一下, 看看是否正确.
报错了, 这个时候看一下报错.

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第4张图片

其实就是因为我们修改了代码, 导致 Test 模块运行不了( Build 会运行 Test 模块 )
这个时候, 我们可以选择把这行代码注释掉, 或者修改成正确代码就可以了, 如下

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第5张图片

上传库到云端

修改好后, 上传库到云端(github, gitee 或者其他托管服务器都行), 我这边上传到我本地 gitlab 服务器.

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第6张图片

项目进行依赖

打开你一个 iOS 或者 Mac 项目都行, 然后进行添加依赖, 操作和 上一篇 一样, 只需要把第三方的 链接 替换为你自己库的 链接 就可以了

不过这里要注意一下, 如果你不想发 Release 版本(偷懒), 就直接选择 Branch, 或者 Commit 就行.
比如我当前没创建 Release 版本, 直接进行依赖的话, 就会出现以下错误

The package dependency graph can not be resolved; unable find any available tag for the following requirements:

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第7张图片

这个时候, 我们只需要把 Version 改为 Branch 或者 Commit 就行了.
例如我这里选择 Branch, 并输入 master 分支, 这样就能点击 Next 了.

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第8张图片

依赖成功

成功之后, 就能看到, 自己的库已经在列表中了

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第9张图片

测试依赖

测试一下库的接口, 如下图

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第10张图片

是的, 至此, 已经完成依赖了. ✌️

库中, 依赖别的第三方

这个只要在库里的 Package.swift 文件, 添加依赖就行了. 如下

import PackageDescription

let package = Package(
    name: "XQPackageTest",
    platforms: [
        .iOS(.v10),
    ],
    products: [
        .library(
            name: "XQPackageTest",
            targets: ["XQPackageTest"]),
    ],
    
    /// 依赖那些第三方
    dependencies: [
        .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(5, 0, 1)),
    ],
    
    targets: [
        .target(
            name: "XQPackageTest",
            dependencies: [
                // 你依赖的第三方
                "SnapKit",
        ]),
        .testTarget( name: "XQPackageTestTests", dependencies: ["XQPackageTest"]),
        
    ],
)

Package.swift 简介

上面说过, Package.swift 是相当于 CocoaPods 中的 xxx.podspec 文件
那么我这里就简单介绍一下里面的一些属性

import PackageDescription

let package = Package(
    
    name: "XQPackageTest",
    
    /// 支持平台多少版本以上
    platforms: [
        .iOS(.v10),
//        .macOS(.v10_12),
//        .tvOS(.v10),
//        .watchOS()
    ],
    
    /// 该库的一些配置
    products: [
        .library(
            name: "XQPackageTest",
            // 动态库 or 静态库
            // 默认为 静态库
            type: .static,
            targets: ["XQPackageTest"]),
    ],
    
    /// 依赖那些第三方
    dependencies: [
        
        // 第三方有良好的版本格式: 大版本.小版本.测试版本
        // 就可以直接用这个
        .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(5, 0, 1)),
        
        // 如果第三方版本格式, 是其他的, 例如 1.2, 根本没用第三位, 那么我们也可以这样, 直接传入字符串
        // .package(url: "https://github.com/SnapKit/SnapKit.git", from: .init(stringLiteral: "5.0.1")),
        
        // 如果第三方目前的 release 版本还没支持 SPM 的话, 我们可以直接指向他的 master 分支
        // .package(url: "https://github.com/SnapKit/SnapKit.git", Package.Dependency.Requirement.branch("master")),
        
        // 当然, 也能关联本地的能支持 SwiftPM 的库
        // .package(path: "../XQSwiftPMTest"),
    ],
    
    
    targets: [
        // 你库的 target
        .target(
            name: "XQPackageTest",
            dependencies: [
                // 你关联的第三方
                "SnapKit",
        ]),
        
        // 测试的 target
        .testTarget(
            name: "XQPackageTestTests",
            dependencies: ["XQPackageTest"]),
        
    ],
    
    // 库支持 Swift 语言版本
    swiftLanguageVersions: [
        .v5
    ]
)

SPM OC

目前, 据我了解, 还不能进行 Swift 和 OC 的混编.
但是能编写 OC 和 C 这些的库, 如下图

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第11张图片

这里要注意一下, 系统默认是公开的 .h是 Sources/[targetName]/include 路径下.
如果要修改为某个路径下的.h文件, 要自己重写 target 的 publicHeadersPath.
publickHeadersPath 默认的路径是在 [Sources]/[targetName] 下.

例如我要暴露整个库所有的 .h
那么如上图, publicHeadersPath 就为 “…/XQPackageTest” 即可

待解决问题

目前还有几个问题待解决, 后续解决了的话, 也会马上更新文章。
当然,如有大佬已经解决了以下问题,请评论或者私信我, 因为我也想知道如何解决 o(╥﹏╥)o

  • 如何直接关联本地代码, 就是不用上传到云端的. 类似 CocoaPods 直接 :path => ‘’ 指向本地
  • 关联 lib 库
  • 关联 framework 库
  • 添加资源文件, 如 .xib, .storyboard, .png, .html, .xcassets, .json, .zip 等等

Authentication failed

选择更新 SPM 库的时候, 偶尔会报错, 如下

x-swift-package-repository-authentication://?scm=com.apple.dt.Xcode.sourcecontrol.Git&url=xxx#error=-1005 Authentication failed because the credentials were missing

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第12张图片

因为有些库是私有库, 需要账号密码, 或者一些其他验证登录.
如果像账号密码登录, 那么过了一定时间, 就会验证失效. 需要重新输入账号密码.
这时候双击图中, 蓝色选中的这个错误, 系统会弹出一个输入框.

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第13张图片
这个时候, 只要输入账号密码, 点击 OK 即可.

库不会更新到最新

修改完自己的库, 提交上去, 偶尔会出现无法下拉最新代码.
这时候选中 File -> Swift Packages -> Reset Package Caches, 如下图.

Swift Package Manager - 教你如何让自己的库支持SPM依赖_第14张图片

如还没有, 那么尝试关闭 Xcode,或点击 Update tolatest Package Versions 操作.

如还是没有的话…那么 Show Find 你的库, 进入到项目的编译缓存文件夹, 删除这个项目的编译缓存
路径如这样 ~/Library/Developer/Xcode/DerivedData/你项目的名称-随机码

一般进行以上操作都是可以的了

你可能感兴趣的:(Swift,iOS,Swift,Package,Manager)