SPM(Swift Package Manager)开发及常见事项

news2024/11/24 14:35:29

SPM怎么使用的不再赘述,其优点是Cocoapods这样的远古产物难以望其项背的,而且最重要的是可二进制化、对xcproj项目无侵入,除了网络之外简直就是为团队开发的项目库依赖最好的管理工具,是时候抛弃繁杂低下的cocoapods了。

一:如何制作?

这里以使用为准,gui操作创建:

1 . 在Xcode顶部菜单选择如下图操作
在这里插入图片描述

2 . 填写或更改自己的库名称,这里为"MyLibrary"
在这里插入图片描述

3 . 这样就生成了一个壳子SPM。里面最重要的就是图中圈出的部分。
Package.swift是描述管理SPM的文件,也是放到github之类的远端仓库后让Xcode识别的依据。Source则是源码存放的地方,现在里面默认是一个结构体,我们可以把自己要做成库的代码放进去(别忘了open public 等之类的权限修饰语)。除此之外还有readme.md,Tests文件夹,由于国内很少有人关注这些文件故这里直接忽略(Tests文件夹内的测试代码删除下,不然自己的代码编译不过)。

在这里插入图片描述

其中Package.swift作为库的描述和配置文件很重要。在这里需要搞懂一个概念,就是一个spm不是只对应唯一一个库的,是可以对应多个。

package = spm
library = 某个库

所以不太恰当的说,spm = 多个库的集合。当然一个spm只对应一个可执行库是没问题的也是很常见的。

import PackageDescription

let package = Package(
    name: "MyKit", // 库名称
    products: [
   		 // spm生成的可执行库(下面的target)和文件,一个spm可对应多个(例如一个RxSwift就对应多个可执行库)
        .library(
            name: "MyKit", // 这俩一般默认相同即可
            targets: ["MyKit"]), // 这俩一般默认相同即可
    ],
    // 此spm库依赖的其它spm库地址,如没有依赖,dependencies可无
    dependencies: [
        // Dependencies declare other packages that this package depends on.
        // .package(url: /* package url */, from: "1.0.0"),
    ],
    targets: [
        .target(
            name: "MyKit", // 可执行库名称,也即在Source文件夹下的代码文件夹名称
            dependencies: []   // 此可执行库依赖的其它库的名称,如没有依赖。可无        
            exclude: ["Info.plist"], // 此库的权限描述plist清单,需要的权限等等
            resources: [
                .process("XXX.bundle") // 此库的资源文件路径
            ]), // 此库的资源文件
        .testTarget( // 此库的测试文件,如没有测试用例,可以删除
            name: "MyKitTests",
            dependencies: ["MyKit"]),
    ]
)

二:如何发布?

如果是在国外,可以不受网络限制直接在Xcode操作就可以发布,但国内受网络限制要采取其他方法才能应对。

1 . 先在github建立一个远端仓库。

2 . 提交创建的spm文件,并将其推送到远端。

// 1.提交创建的spm文件或者更改的文件
git commit -m "first commit"
// 2.切换到主分支上
git branch -m main
// 3.设置远端仓库
git remote add origin https://github.com/xxx/GithubTest.git
// 4.推到远端仓库,并输入密码和token
git push -u origin main

在推送期间要科学上网,不然推不成功。

如果没有科学上网的工具怎么办?其实可以不用放到github上。既然github访问不了,那gitlab或者gitee总是可以正常访问的,这也是个解决办法。

那如果想用xcode操作怎么办?xcode网络走的不是系统代理,所以你用clash等工具设置全局代理是没用的,但是可以专门为Xcode设置访问代理,这样就访问更新正常了。

最后

spm还可引入oc / c / c++,至于二进制化或者静态库大家可以共同探讨,这方面的网上资料较少

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/841586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 ChatGPT 规划家居装修

你正在计划家庭装修项目,但不确定从哪里开始?ChatGPT 随时为你提供帮助。从集思广益的设计理念到估算成本,ChatGPT 可以简化你的家居装修规划流程。在本文中,我们将讨论如何使用 ChatGPT 有效地规划家居装修,以便你的项…

vue diff 前后缀+最长递增子序列算法

文章目录 查找相同前后缀通过前后缀位置信息新增节点通过前后缀位置信息删除节点 中间部份 diff判断节点是否需要移动删除节点删除未查找到的节点删除多余节点 移动和新增节点最长递增子序列 求解最长递增子序列位置信息 查找相同前后缀 如上图所示,新旧 children 拥…

SCT82A30DHKR_5.5V-100V Vin同步降压控制器

SCT82A30是一款100V电压模式控制同步降压控制器,具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比,实现从48V输入到低压轨的直接降压转换,降低了系统复杂性和解决方案成本。如果需要,在低至6V的输入电压下降期间&am…

Photoshop 2023 25.0beta「Mac」

Photoshop 2023是一款专业图像处理软件,它主要用于图像编辑、合成和设计等方面。 Photoshop beta创新式填充的功能特色包括: 自动识别和删除对象:该功能可以自动识别图像中的对象,并用周围的图像填充空白部分,使图像看…

window系统下 tinymce富文本编辑器在搜狗输入法下placeholder不消失现象

window 搜狗输入法下编辑器占位符和内容重叠问题 这种情况是,tinymce插件库存在一些兼容BUG,需要我们自行手写样式或者js替换掉placeholder,代码如下: // 获取富文本框的内容const handleChange (editorContent) > {// cons…

C++11 新特性 ---- final 和 override

一、final C中增加了final关键字&#xff0c;作用如下&#xff1a; ① 限制某个类不能被继承② 或者某个虚函数不能被重写 ① 限制某个类不能被继承 // ① 限制某个类不能被继承,也就是说这个类不能有派生类 class Base{ public:virtual void print() {cout<<"Ba…

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展&#xff0c;对电商数据的需求也越来越大。在获取电商数据时&#xff0c;常常面临一个选择&#xff1a;是自己编写网络爬虫进行数据爬取&#xff0c;还是使用现有的付费数据接口呢&#xff1f;本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

【css】组合器

组合器是解释选择器之间关系的某种机制。在简单选择器器之间&#xff0c;可以包含一个组合器&#xff0c;从而实现简单选择器难以达到的效果。 CSS 中有四种组合器&#xff1a; 后代选择器 (空格)&#xff1a;匹配属于指定元素后代的所有元素&#xff0c;示例&#xff1a;div …

element-ui表格数据为空,图片占位提示

当表格的绑定数据为空时常需要显示暂无数据等字样&#xff0c;这时候就用到了empty-text <el-table:data"tableData"stripeborderempty-text"暂无数据"> 但&#xff0c;当数据为空&#xff0c;想用图片展示呢&#xff0c;如下图 方法一&#xff1a…

java.lang.UnsupportedClassVersionError TestCase

JavaFramework-JDK6.jar 放到JDK17运行没有问题 JavaFramework源码放到JDK17环境下编译出来的JavaFramework-JDK17.jar JavaFramework-JDK17.jar 放到JDK17运行没有问题 JavaFramework-JDK17.jar 放到JDK8运行没有问题&#xff0c;这个好像不对啊&#xff0c;可能之前编译设置…

day39反转字符串总结

反转字符串原理其实就是交换位置&#xff0c;以中间为分隔点&#xff1b; 基本套路&#xff1a;遍历前一般字符&#xff0c;互换位置&#xff1b; for循环模板 void reverseString(char* s, int sSize){char temp;for (int i 0, j sSize - 1; i < sSize/2; i, j--) {temp…

【无公网IP】本地电脑搭建个人博客网站(并发布公网访问 )和web服务器

【无公网IP】本地电脑搭建个人博客网站&#xff08;并发布公网访问 &#xff09;和web服务器 文章目录 【无公网IP】本地电脑搭建个人博客网站&#xff08;并发布公网访问 &#xff09;和web服务器前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在…

【Rust】Rust学习第三章常见编程概念

包含第一、二章 文档&#xff1a;Rust 程序设计语言 - Rust 程序设计语言 简体中文版 (bootcss.com) 墙裂推荐这个文档 第一章入门 入门指南 - Rust 程序设计语言 简体中文版 第二章猜猜看游戏 猜猜看游戏教程 - Rust 程序设计语言 简体中文版 (bootcss.com) // 导入库 us…

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…

H263压缩码流如何分解为一个一个单元并查询到其宽高?

H263码流尺寸规格有限&#xff0c;只有以下几种&#xff1a; H263码流有四个分层&#xff1a; 1、图像层 2、块组 3、宏块 4、块 下面分别介绍&#xff1a; 具体介绍如下&#xff0c;5.1.3中红色框选部分就是压缩码流的宽高指示&#xff1a; 图像层 上面就是H263的图像层&am…

QT开发学习相关笔记

QT中配置文件读取 QT中使用的config文件为&#xff1a;xxx.ini文件,基本格式如下&#xff1a; 使用 QSetting&#xff08;QT自带类&#xff09;中的相关接口实现设置配置文件数据&#xff0c;或者读取数据。 读取配置文件路径设置如下&#xff0c;其中 iniPath为设置路径 ne…

word2003脚注问题

问题分析&#xff1a; 在题目上插入脚注的时候&#xff0c;脚注放在文件结尾&#xff0c;然后正文拆开了&#xff0c;不能续前节 解决办法&#xff1a; word2003中&#xff0c;工具->选项->兼容性

进程间通讯(IPC机制) 管道 信号量 共性内存 消息队列 详细图解

进程间通讯-IPC机制 常用命令管道有名管道读写编程有名管道示意图 无名管道 信号量信号量的概念信号量接口函数进程 a 和进程 b 模拟访问打印机 用信号量互斥画图分析代码实现测试结果显示和操作 共享内存 信号量 消息队列 的命令 共享内存共享内存定义共享内存函数接口实例编程…

docker镜像push到仓库

镜像可以很方便直接 push 到 docker 的公共仓库或阿里云仓库 一、Dockerpush指定仓库是什么&#xff1f; Dockerpush是Docker的一个命令&#xff0c;用于将本地的Docker镜像推送到Docker官方公共仓库或用户私人仓库。而指定仓库则是将这个Docker镜像推送到指定的仓库中。 通过D…

【独立后台】快递小程序便宜寄快递系统小程序 对接易达

快递代发项目简介&#xff1a; 顾名思义就是帮发快递。原本产业链是客户-快递之间的联系&#xff0c;现在变成了客户-我们-快递&#xff0c;简单来说就是我们把客户聚集到一起团购到了更优惠的价格。很简单就是赚一个差价&#xff0c; 单子多就能和各个快递合作的平台&#x…