0 在写下面的内容之前,本来想直接用swift3.0上传cocoapods,可是发现之前在swift2.3的时候上传没有问题的,在swift3.0都存在问题了,加上自己的项目也比较忙,就没有继续往下找原因,在此就把3.0以前踩过的坑和解决方案写在这里,希望能帮助更多的朋友,好了,不废话了,开始!
1 你要在github上新建仓库
- 具体怎么建在这我不做详细介绍了,很简单,如果实在不会可以度娘或者简书,里面有许多,下面是我的目录结构
2 然后把仓库克隆到本地,会看到下面的截图
git clone https://github.com/CoderST/STRowFollowLayout_SWIFT.git dao
3 然后输入下面的命令 STRowFollowLayout_Swift换成你自己的名称
pod spec create STRowFollowLayout_Swift
- 这个时候你会在当前目录下多出一个文件
4 最好下载个Sublime程序(也可以是别的编辑器,可以百度自己找一下),专门用于编辑podspec(因为直接用系统的编辑器打开被坑过,(。・∀・)ノ゙)
5 用sublime编写下面的代码,注意要写清楚,不然会报错
s.name:名称,**pod search name** 的 name
s.version:版本号
s.ios.deployment_target:支持的pod最低版本
s.summary: 简介
s.homepage:项目的地址
s.license:开源许可
s.author:作者信息,表示格式为 { "[作者名]" => "[邮箱]" }
s.source:项目的git代码仓库的地址,如格式为:{:git => "[git代码仓库地址]", tag => "[版本号]"}
s.frameworks:表示需要的框架,如'Foundation',多个框架之间以英文逗号分隔。
s.source_files:别人通过你的pod引用文件的层级目录。如我要引用FGGDownloader文件夹下的.h和.m文件,则可以写成'FGGDownloader/*.{h,m}'
s.requires_arc: 是否支持ARC
s.dependency:依赖的项目,如有多个,则写多行#表示注释文
有时候验证会报一大堆错误,原因是 xcodebuild
编译时使用的 Swift 版本和你代码当前使用的版本可能不一样,
- 这时候就需要指定一下 Swift 版本,指定方法是在 podspec 同目录下创建一个 .swift-version 的文件,在里面写上 Swift 版本即可,例如 4.0 ,
- 或者 : 在终端输入以下命令也可以创建,创建完以后在执行 pod lib lint 就可以编译通过了。命令如下
echo "4.0" >> .swift-version
6 编写后记得git一下
git add .
git commit -m"改动的内容"
git push
7 给项目打tag
- 在此之前确定一下自己的podspec文件里的版本最好和tag一样
git tag '0.0.1'
git push --tags
8 此部非常重要,如果错误会报错误(经常会出现的错误-第八步骤,出现错误慢慢调),此处的STRowLayout.podspec改为你自己的podspec
pod spec lint STRowLayout.podspec --allow-warnings
- 看到上面的截图,恭喜你,说明你已经验证通过啦!!!
RowFayout git:(master) pod spec lint STRowLayout.podspec
-> STRowLayout (1.0.0)
- ERROR | file patterns: The `source_files` pattern did not match any file.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error.
如果出现的不是error都没有问题,像我下面出现的这个问题,就是当时问了省事,没有对上传的文件进行描述,所以就出现了一个⚠️
如果出现下面的错误,是因为你没有创建一个工程,在当前git管理下创建一个工程即可
Failed to locate a valid instance of CoreSimulatorService in the bootstrap. Adding it now.
- 但是我在此步骤的时候一直报一个错误,具体原因是为什么没有找到,找到了解决办法,截图如下
echo 3.0 > .swift-version
还有一种原因是:执行pod lib lint XXX --verbose 查看具体原因,如果有 ** BUILD FAILED **字样,则是当前私有库文件编译时有语法错误或需要第三方类库,可执行
pod lib lint --quick 命令不让编译源文件。
9 如果上面一部通过,恭喜你💐 已经进行一大半了,下面就是 - 注册trunk(此处的邮箱和后面的名称都要改成你自己的,要和github上一致)
pod trunk register 694468528@qq.com 'CoderST'
等一下,你会在你注册的邮箱里收到一份邮件,点击链接验证一下OK就行了,然后在进行第10步操作
10 查看自己注册信息
pod trunk me
11 提交
pod trunk push STRowFollowLayout_Swift.podspec --allow-warnings
- 此步骤需要一点耐心➕网络情况,有内心网络差你会看到下面情况
[!] There was an error pushing a new version to trunk: getaddrinfo: nodename nor servname provided, or not known
- 不要着急,这个不是你的配置文件或者命令不正确,都是你网速惹的祸,多试几个这个命令就应该能好
- 看到下面的截图 恭喜你已经成功了
12 别慌恭喜和草泥马,以为成功了 在pod search STRowFollowLayout_Swift会报错
- 如果报错是下面的 原因是不能重复提交,如果需要再次提交,需要重新打tag和编辑STCustomWidthLayout.podspec里的文件,把他们的tag都要统一.
[!] Unable to accept duplicate entry for: STCustomWidthLayout (0.0.1)`
- 加上下面这个命令就好了
rm ~/Library/Caches/CocoaPods/search_index.json
13 试一把 果然OK
14 晴天霹雳了,草,都已经pod上去了,但是在新建项目pod下来自己的框架后,在viewController中import自己的框架也是没有问题的 但是但是... 在初始化的时候尽然不行,错误提示❌cannot call value of non-function type
- 解决 : 后来办法,漫天百度 谷歌,没有好到好的解决方案,于是就下载了SnapKit大神的框架,看看他们的方法与自己的有什么不同,后来我就在自己的类前面加上了public(swift2.3版本,3.0要加上open)
部分代码
代理部分
@objc public protocol STCustomWidthLayoutDelegate : class {
// Variable height support
func stLayoutWidthtForRowAtIndexPath(stLayout : STCustomWidthLayout, indexPath : NSIndexPath)->CGFloat
// Height of Item
@objc optional func heightForRowAtIndexPath(stLayout : STCustomWidthLayout)->CGFloat
// Space of Colums
@objc optional func layoutcolumnSpacingStLayout(stLayout : STCustomWidthLayout)->CGFloat
// Space of Row
@objc optional func layoutRowSpacingStLayout(stLayout : STCustomWidthLayout)->CGFloat
// TOP DOWN LEFT RIGHT
@objc optional func layoutEdgeInsetsStLayout(stLayout : STCustomWidthLayout)->UIEdgeInsets
}
public class STCustomWidthLayout: UICollectionViewFlowLayout {
// MARK:- 变量
/** 记录当前是第几行 */
private var stCurrentRow : Int = 0
/** 每一个item左边的的位置 */
private var stItemLeft : CGFloat = 0
/** 代理 */
weak public var delegate : STCustomWidthLayoutDelegate?
/** 边缘间距 */
private var stEdgeInsets_c : UIEdgeInsets?{
return delegate?.layoutEdgeInsetsStLayout?(self) ?? stEdgeInsets
}
/** item高度 */
private var stItemHeight_c : CGFloat?{
return delegate?.heightForRowAtIndexPath?(self) ?? stItemHeight
}
/** 列间距 */
private var stColumSpacing_c : CGFloat?{
return delegate?.layoutcolumnSpacingStLayout?(self) ?? stColumSpacing
}
/** 行间距 */
private var stRowSpacing_c : CGFloat?{
return delegate?.layoutRowSpacingStLayout?(self) ?? stRowSpacing
}
// MARK:- 懒加载
/** atttibutesArray */
private lazy var atttibutesArray : [UICollectionViewLayoutAttributes] = [UICollectionViewLayoutAttributes]()
}
尾随:上面的publish部分更具代码的实际情况酌情使用,可以参考大神们的框架模仿使用
15 下面在说说如何更新吧
- 在推送podspec文件之前你需要确认以下几点:
- 确保你的源码已经push到Github上
- 一:
git add .
git commit -m "first commit for version 1.0.0"
git push origin master
- 二 确保你所push的代码已经打上"version tag",也就是给源代码打上版本号标签
git tag '1.0.0'
git push --tags
- 最后验证可以按照上面的操作来进行