缘续
这此打算生成静态库也同时托管到Cocoapods上管理,这样以后更新维护也方便一点
Cocoapods是啥?这个大家可以自从百度一下,网上相关的介绍已经太多了,这里就不赘述了
工欲善其事 必先利其器
工具版本号:
Cocoapods: 1.9.1
Xcode: 11.7
这样的首先先来Github上创建一个仓库
在这里呢,我在想一个问题,我们的Github仓库是建Public还是Private呢?如果是Private的到时候上传Cocoapods的时候会不会出现问题呢?
这边就像留个疑问这里后面再试一下
命名一直是令程序员头疼的问题,我取名Labrador(拉布拉多)正好有看门狗的含义,帮助我们守住内心的底线......又扯远了
创建本地工程
远程仓库有了,接下来就是创建一个本地的静态库项目关联到Github仓库上了
大家可以选择直接Xcode手动创建一个静态库项目,这种方式的在这里也不多赘述了,因为网上相关的资料是在太多了
因为之后是会打算把生成的静态库托管到Cocoapods上的,所以直接使用
pod lib create XXXX
直接使用Cocoapods的静态库模板创建,方便又省心
Just Do IT!
此时我们只要耐心等待就行,一会儿会出现几个拷问灵魂的问题
大家根据自己的实际情况填写就行了
接下来我们可以先看一下Cocoapods模版创建的项目的文件目录结构,都有些啥
这里我们就看主要会涉及到的
- Example:使用Cocoapods模版的时候会询问是够是要一起创建个Example工程,这个不用想一般肯定要啊,不然写出来的代码难道还要新建工程测试吗?
- Labrador_swift:当然这个是我这这边的命名,这个文件下面就是存放的静态库里面具体的功能的代码了, 里面还有两个文件夹
Assets
和Classes
顾名思义 一个是放资源文件的,一个是放代码文件的 - Labrador_swift.podspec:这个其实就是一会上传Cocoapods的使用到的配置文件,里面涉及的内容非常多,当然我们这次需要使用的就几个,更多的内容大家可以自行百度哈
本地工程和远程仓库关联
本地工程先随便来个commit
这边有个地方要注意,提交代码的时候,最好在项目的根目录上,如果在子文件下的话,gst
的话可以看有待提交的文件,但是git add .
就是添加不上去,一般工程的名字和里面静态库代码的文件夹的名字是一样的,一不留神就搞混了
commit
好了之后,二货不说直接git push
当然肯定是推不上去的
有这些提示就简单了,依葫芦画瓢呗
OK, 到这一步本地工程就已经推送到远程仓库了
刷新一下Github 会发现仓库已经有内容了
工程配置修改
到这里如果大家觉得就可以开开心心的撸代码了
那你就中计了,Too Young Too Sample!
Cocoapods模版创建出来的不是静态库而是动态库,而且Architecture模式也要修改
至于动态库和静态库的区别差异,又到了大家自己动手丰衣足食的环节了
动态库笔者试了一下也是可以满足我们的需求的,不过老话说的好
千年王八万年,所以我选择了静态库 哈哈哈~~~~
- 修改工程配置为静态库
打开Example
目录下的workspace
工程,选中Pod
工程中的Labrador_swift
target
然后Build Settings
中搜索Mach-O Type
,你会看到
默认选中的是Dynamic Library
这个就是动态库的意思,我们切换成Static Library
- 修改Architecture模式
同样在上述的Build Settings
中搜索Architecture
,你会看到
有个Build Active Architectures Only
选项,这边有两个Debug
和Release
两种模式,默认Debug
是Yes,Release
是No
这是个什么意思呢?
其实就是你构建的静态库支持的架构,如果配置的No,就是构建的静态库会支持所有的架构,配置Yes的话,就只会构建当前选中的架构,比如你选择模拟器是iPhone 11 Pro
那么就会构建只支持iPhone 11 Pro
架构的静态库
具体的细节在后面我们成功构建出静态库的时候再详说
其实这边的Build Active Architectures Only
选项可以不用修改,一般我们打出来的静态库也基本都是都Release
版本,所以Release
已经是支持所有架构的配置,我们就不用在多次一举的修改了,就这样吧
Coding
接下来就可以先写点测试代码了
静态库的代码之后放在Example
的Classes
文件下就可以了
在代码文件夹Labrador_swift
文件(Labrador_swift是我这边的文件夹命名,大家命名肯定都不一样)下会看到一个ReplaceMe.swift
文件,这个是模版生成时候自动生成的文件,之后可以删除掉
我这边新建了一个Test
对象,写了一个func es_p()
的测试打印方法
接下来可以先去Example
的Demo中测试一下
成功打印
接下来就是打包静态库了
打包静态库
大家如果有查阅过Cocoapods发布静态库相关的资料,一定会查到一个插件工具cocoapods-packager
查下来说是一行脚本就是实现打包静态库功能
但是我没有使用的原因很简单
因为跑脚本没有成功过,花了不少时间研究,还是没有成功,只能哭晕在厕所
所以要是哪位大哥知道cocoapods-packager
正确使用姿势,还望教教小弟
官断十条路
条条大路通罗马
插件不行就手动操作
首先先要找到打出来的静态库在哪里
没错是他、是他、就是他
在打包之前,首先有个地方要注意
静态库打包的话打
Realse
版本的
静态库分为真机、模拟器两个包
真机:只支持真机的架构
模拟:只支持模拟器架构
如果想要自己的静态库框架真机、模拟器都支持的话,两种架构的静态库到时候需要合并成一个
模拟器架构:i386、x86_64
真机架构:armv6、armv7、armv7s、arm64
话不多说,先打出真机、模拟器两个版本的静态库再说
直接选择Realse
,分别选择任意一个模拟器和Generic iOS Device
分别编译一下就行
Generic iOS Device
模式下需要自行配置一下签名证书啥的
每次Build
之前最好clean
一下
直接右击Show in Finder
不出意外的话,分别选择真机和模拟器编译之后,你会看到这两个打包出来的静态库
接下来就是合并静态库
合并静态库
凡事不要急,先看看啥情况
现在我们有两个静态库了,看文件夹的名字也能判断哪个是真机的,哪个是模拟器的
图片中框出来的就是静态库本体,一会要合并的就只这个
首先我们可以通过lipo -info XXX
先查一下这个静态库的信息
可以看到一个是真机架构、一个模拟器架构
接下来就让他们合体
lipo -create 模拟器静态库路径 真机静态库路径 -output 合并库的输出路径
合并静态有两个小坑让我抽半包烟
- 合并的出来的静态库的命名要和之前编译出来的静态库的命名一样,不然使用的时候会报找不对文件错
- 合并出来的静态库名字就不要加文件类型后缀了
接下来通过file
命令
查一下库是不是静态库
看到这样的current ar archive random library
字样就说明是静态库了
如果是动态库的话会看到Dynamic
的字样
现在合并的静态库已经有了
但是!!!
不是直接使用这个合并出来的库,还有一些头文件、配置文件啥的,不然在其他项目中使用还是报找不到文件的错
那头文件、配置文件在哪里呢
其实也很简单,我们再看一下刚才打包出来的真机静态库的文件夹
直接把这里的Labrador_swift
替换成刚才的合并出来的静态库,然后再把模拟器静态库文件夹中一些文件Copy过来就行了
就是把这里的文件Copy到真机静态库文件下相同路径的位置下
合并之后长这个样子
接下来我们要用的就是
洗洗手,准备上传Cocoapods了
上传Cocopods
上传Cocoapods的准备工作就不介绍了
我们现在回到Labrador_swift
这个项目
先把刚才的静态库拷贝到项目目录下,放的位置要注意好,因为一会配置podspec
的时候要用
接下来开始编辑podspec
了
一些常见的配置属性就不说了
说几个关键的
-
vendored_frameworks
:这个地方配置刚才导入到项目中的静态库的相对路径,我的放在根目录上 -
pod_target_xcconfig
:如果不配置,pod校验的时候会报错 -
source_files
:要注释掉,不然被人pod install
的时候还是会把源代码拉下来的
万事俱备 只欠东风
推代码、打tag,从此走上人生巅峰
先来pod lib lint
一下,这里校验的时候要加上--skip-import-validation
不然会报错
校验没有问题
二话不退,发布Cocoapods
oh yeah~~~ 发布成功
来来来,搞个新项目测试一下,激动人心的时刻终于到了
- pod install 成功
- 框架引入成功
- 测试类创建成功
- 打印日志成功
收工~~~~~
想的美,还有两个问题等着我们
1.还有一个就是我们重新进入工程的Example文件下,pod install
运行一切正常,但是Pod工程下也变成静态库了,WTF!!!那怎么编辑修改??
- 就是我们刚才说的如果github仓库是private的会是什么情况
凡事不要慌,我们一件一件的来解决
第一个问题,Example
项目的podfile
中引用的静态库也是跟着之前配置的podspec
文件来的,所以想看到源码,只要把source_files
打开 pod_target_xcconfig
和vendored_frameworks
注释掉,重新pod install
一下就OK了,又可以愉快的撸代码了
还有就是之前把Scheme
改成了Release
记得再改回成Debug
第二个问题:直接把GitHub仓库改成Private
的,再发布个版本一试便知
额,果然报错了,这么看来是不行的,确实是的似有库项目想发布给外界用,确实理论上就有冲突,那咋搞万一别人通过我的github找到源码,前面搞那么多不久白忙活了吗?
后来想了想,暂时就先通过
ignore
把静态库的源代码文件夹忽略掉,不提交就行了,有面有什么好方面再尝试一下