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

前言

系列目录

  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 是我后面自己加上的 )
在这里插入图片描述

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

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

使用 Xcode 初始化

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

在这里插入图片描述

编写库代码

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

上传库到云端

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

在这里插入图片描述

项目进行依赖

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

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

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

在这里插入图片描述

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

在这里插入图片描述

依赖成功

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

在这里插入图片描述

测试依赖

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

在这里插入图片描述

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

库中, 依赖别的第三方

这个只要在库里的 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 这些的库, 如下图

在这里插入图片描述

这里要注意一下, 系统默认是公开的 .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

在这里插入图片描述

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

在这里插入图片描述
这个时候, 只要输入账号密码, 点击 OK 即可.

库不会更新到最新

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

在这里插入图片描述

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

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

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
出现"Unable to locate package ros-foxy-xacro"的错误可能有几个原因。首先,可能是因为输入的软件包名称与ROS版本不匹配。例如,在使用ROS Foxy版本时,输入了针对ROS Melodic的安装指令。其次,可能是因为未更新软件包索引。解决这个问题的方法如下: 1. 确保输入的ROS版本与系统中安装的版本匹配。如果你使用的是ROS Foxy,应该输入正确的安装指令:sudo apt-get install ros-foxy-xacro。 2. 在输入安装指令之前,运行sudo apt-get update命令以更新软件包索引。这将确保系统能够找到所需的软件包。 综上所述,如果你遇到"Unable to locate package ros-foxy-xacro"的错误,首先确认输入的ROS版本是否正确,并运行sudo apt-get update命令更新软件包索引。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [ros Unable to locate package 找不到ROS软件包的问题解决](https://blog.csdn.net/TU_Dresden/article/details/126762166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [ubuntu中安装ros的一些package时出现“unable to locate”的解决办法](https://blog.csdn.net/weixin_39754100/article/details/117536986)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值