作者:king1994 | 来源:互联网 | 2023-09-03 20:58
记录一次上传文件到 pod 的初级体验
iOS常用第三方管理工具cocoapods,很多人都在用,也确实方便。那么如何将自己的代码发布到cocoapods呢,作为萌新就baidu、google呗。
当然,作为萌新,尝试的时候肯定都是坑啊,要不然咋是萌新呢。
ps :诀窍–尝试的时候尽可能精简,这样容易过,一次一次增加难度,这样出现问题的时候就不会太多,解决起来也不会有砸电脑的冲动^_^
使用pod模板开发项目 关于pod lib create
pod lib create projectName
手动创建podspec
- 新建项目,提交到GitHub或者其他代码托管网站,有下载链接就行(后边需要用到托管平台的代码tag或者commit 作为需要发布的版本代码)
- 我查看过一些其他人写的,会把要上传的文件提到项目根目录,或者复制一份,但是我觉得比较麻烦,还是按照正常的项目处理的,也是可以的,木有问题
- 准备 podspec 文件
- 打开终端,cd到项目当前跟目录,执行
pod spec create xxxname
(xxxname为项目名称)
- 具体内容
Pod::Spec.new do |s|
s.name = "BSAFNetWorking"
s.version = "0.1.0"
s.summary = "AFNetWorking changed BSAFNetWorking"
s.description = "blackstar_lang@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/BlackStarLang/BSAFNetWorking.git", :tag => s.version }
s.source_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.public_header_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.framework = "UIKit"
s.dependency "AFNetworking", "~> 3.0"
s.license= { :type => "MIT", :file => "LICENSE" }
s.subspec 'BSApi' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi/*"
ss.framework = "UIKit"
end
通过命令行创建的文件是带有很多注释的,不过很多我都用不上,为了看的清楚,我把没用的都删了。如果想看所有的,可以看看具体的项,以便于增加或修改spec项
spec文件中的每行代码的意思差不多翻译就可以了
-
划重点:
- 注意示例汇中 s.description 的格式,格式不对会报错(当然, s.description 整行注释掉也可以)
- s.license 必须要有,我是到MIT官网找的,也可以是 .md & .txt格式的,或者其他协议 ,协议内容如下(只需要改变第一行版权所有人信息即可,其他不用动),但是可能出现发布后出现 warning的问题,说找不到LECENSE,解决办法就是在GitHub或者gitlab上都可以直接在仓库中新建,然后可以选择很多种种类的,我都是选择MIT,我将gitlab或github上创建的开原协议引用到此处就没有再报警告
Copyright (c) 2018 BlackStar
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
- s.dependency 是你项目需要依赖的第三方,比如说我的这个是封装的AFNetworking ,肯定需要依赖AFNetworking的,所以,依赖一个写一个,依赖多个写多个,写法基本和podfile里一样,可以不加版本号,但是不能指定代码源,代码源都是在podfile里去声明的 ,如下:
s.dependency "AFNetworking"
s.dependency 'SDWebImage','~> 4.1.0'
- s.framework 是依赖的系统框架,我这里只用了 UIKit。
如果依赖多个系统框架,可以一行搞定,和dependency是不一样的,dependency是不支持多个依赖一行搞定的,注意 frameworks 是带有s的哦,这个和依赖单个框架是不一样的。
s.frameworks = "UIKit","UIFoundation"
5.特别注意 s.source_files 坑很多,一定要搞准你要上传文件的目录位置,要不然一遍一遍过不去
搞不准目录写的对不对点击这里看demo
我们的pod文件可能是有多个文件夹的,如果不特殊处理,上传后的文件是没有分目录的,和我们工程内分的目录没关系,都在一个文件夹里。想要带有目录结构需要将每一个文件夹设置成子模块,具体写法如下
Pod::Spec.new do |s|
s.name = "BSAFNetWorking"
s.version = "0.1.0"
s.summary = "AFNetWorking changed BSAFNetWorking"
s.description = "blackstar_lang@163.com" }
s.platform = :ios, "8.0"
s.source = { :git => "https://github.com/BlackStarLang/BSAFNetWorking.git", :tag => s.version, :submodules => true}
s.source_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.public_header_files = "BSAFNetWorking/SQBaseApi/BSAFNetwroking.h"
s.framework = "UIKit"
s.dependency "AFNetworking", "~> 3.0"
s.license= { :type => "MIT", :file => "LICENSE" }
//子模块
s.subspec 'BSApi' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi/*"
ss.framework = "UIKit"
end
//子模块
s.subspec 'BSApi1' do |ss|
ss.source_files = "BSAFNetWorking/SQBaseApi/BSApi1/*"
ss.framework = "UIKit"
end
end
看好几个end哦。
注意 :每个subspec 对应一个end,如果不想将组件发布出来供大家使用,只是想公司内部使用,可以将podspec放在 自己的项目网络地址上,比如说在公司的 gitlab 上,创建一个项目专门用来管理podspec
创建后复制仓库地址,终端执行命令,对应命令:
pod repo push 你的仓库地址 xxx.podspec --allow-warnings
发布完成后,需要用的时候,需要在podfile里声明你的podspec仓库地址
source 'https://xxxxx.git'
然后你就可以下载使用了,如果你是用的非GitHub进行托管的(如gitlab),pod search 是搜不到的,因为他是私有的(如果想开源给大家,那就上github,然后发布到开源库)
参考demo
- podspec 文件准备好后,检查文件合法性
pod spec lint xxxx.podspec --allow-warnings
需要加 –allow-warnings,要不然基本过不去
可能报错 第三方引入有问题,让你用#import的方式引入,引入的时候主要要带有 文件路径引入,如引入AFNetworking需要这么写#import
不能写#import
或者 #import "AFNetworking.h"
如果改完代码 还是报这个错误,需要清理缓存 :
pod cache clean --all
//然后在
pod spec lint xxx.podspec
如果对自己有信心也可以不走lint的步骤,直接发布
- 这一步过了就说明代码已经木有问题了,那么如何提交到网络供人下载使用呢?
//终端执行
pod trunk me //检查是否有账户
//没有则注册,邮箱地址需要真实有效,需要接收邮件验证,好像需要翻墙,不大记得了
pod trunk register 邮箱地址 "昵称"
//例子:
pod trunk register blackstar_lang@163.com "BlackStar"
pod trunk push xxxx.podspec --allow-warnings
- 发布成功后,pod search xxxx 试试可不可以搜索出来,如果确定发布成功了,但是搜不出来,需要重置 pod的searchindex
cd ~/Library/Caches/CocoaPods/
//然后执行
rm -rf search_index.json
重新 pod search 就可以了
有的时候我们在pod 上发布了,但是又不想发布了,想要发布到私有库上,那么我们可以执行以下操作,删除公共库中的组件
//查看自己的邮箱,和发布过的公共库
pod trunk me
//然后执行命令删除组件版本
pod trunk deprecate 组件名称 版本号
//例子:
pod trunk delete BSAFNetworking 0.0.1
//然后更新本地repo
pod repo update
然后发布到自己的库
pod repo push xxxx地址 xxxx.podspec --allow-warnings
这就是此次发布pod的全过程了,如果你也遇到了问题,可以留言共同研究哦
补充报错解决方案
xcrun: error: unable to find utility “simctl”, not a developer tool or in PATH
) during validation.
解决办法:将Xcode的line Tools 打开设置上即可