Cocoapods私有库制作

3,630 阅读8分钟

先上干货

创建远端私有库

去gitlab创建远端私有库,这个过程不赘述,如果后面需要创建例子工程,这里不需要创建Readme等文件。建议搞个例子文件,配置完编译一下先把问题解决了,否则后期pod spec lint会出很多问题

添加本地的repo

pod repo add xxx(远程库的名称) xxx(git地址)

将xxx远程库添加到本地repo, 添加成功后可以在/.cocoapods/repos/目录下可以看到官方的specs:trunk和刚刚加入的specs:xxx

创建本地仓库

pod lib create xxx(本地项目名称)

会从cocoapods下载一份例子代码下来,下面有几个步骤需要答题:
iOS(开发平台)/Objc(代码语言)/Yes(是否创建demo工程,建议)/None(是否添加测试框架)/No(是否添加基于视图的测试)/项目的前缀
创建完成会自动打开项目,在项目目录下会出现demo工程的代码 image.png

修改文件夹名称(重要!!!)

这里把项目里的与podspec位置对齐的xxx(项目名称)文件夹(里面包含Classes文件等)修改为其他的名称!这个很重要,否则后期是无尽的no-clean或者Classes文件报错。我这里把原先的NRBaseSpecs文件夹修改成了Pod: image.png 原因是这里如果不修改名称,那么在你最后发版pod repo push之后在.cocoapods下面的私有库文件夹里就会变成这样,是因为系统会自动生成版本的文件夹,如果不修改名称那么就会放在一起,导致在你的项目引用它时就会报Classes和Assets的错误,你需要删除它们,每次发版本都需要删除它们才能正确pod install下来,很麻烦: image.png 修改了名称之后.cocoapods下面的私有库就成了这样,Pod是修改之后的名称,它包含了我们的源码,NRBaseSpecs是系统自动生成的文件夹包含了我们发的版本号 image.png

替换源码

然后上面那步的Pod文件下面的Classes文件夹里删除ReplaceMe文件,加入我们的源码。

编辑xxx.podspec文件

s.name 项目名称
s.version 项目版本号
s.source 其中git后面的地址为远程仓库的地址
s.source_files  为源码匹配规则 可以写为TestModule/Classes/**/*.{h,m}这样只陪位.h,.m文件,匹配规则根据需要进行改变,位置是与podspec平齐,可以从这个路径开始写
s.frameworks UIKit、Foundation等用到的库都要写
s.dependency 为该模块依赖的其他第三方库 
如果依赖多个库,要按如下方式添加
s.dependency 'AFNetworking'
s.dependency 'SDWebImage'
多个库必须换行添加,不能以逗号分隔
s.vendored_libraries 依赖第三方静态库
如:s.vendored_libraries='xxxx.a','nnnn.a'
s.vendored_frameworks = 'Pod/Classes/**/*.framework'依赖的framework

image.png

添加Pods仓库的源地址(重要!)

在demo项目的Podfile顶部添加

source 'xxxx(第一步的远程仓库地址)'
source 'https://github.com/Cocoapods/Specs.git' (Cocoapods引擎库)
#CDN的truck,source修改为source 'https://cdn.cocoapods.org/'

Pofile里的支持版本需要与podspec里的支持版本一样

pod install

在demo项目下的Example文件夹下面执行pod install,会把Classes里的代码还有podspec复制到Pods下面,可以在测试工程里调用Pods里的类库,编译通过之在终端回到上一步包含git的目录下

pod lib lint 检查本地库

pod lib lint  
如果想要忽略警告错误需要在后面添加 --allow-warnings
pod lib lint --allow-warnings 
如果创建的项目依赖了其他第三方库需要添加 --use-libraries 
pod lib lint --allow-warnings --use-libraries
如果依赖的第三方库也是私有库 需要指定--source
pod lib lint --use-libraries --allow-warnings --sources=xxx(私有库的名称就可以),https://cdn.cocoapods.org/

将本地代码push到远程

git remote add origin xxx(第一步远程仓库的链接)
git add .
git commit -m 'xxx'
git push origin master
git tag -a '0.0.1'(此处的版本号需要与podspec里的一致) -m 'xxx(打tag的说明)'
git push --tags

pod spec lint 检查远程库(要先上传代码再进行这一步,记得打tag)

pod spec lint 
如果忽略警告,添加--allow-warnings
pod spec lint --allow-warnings
如果引用其他第三方库 添加 --use-libraries
pod spec lint --allow-warnings --use-libraries
如果引用第三方库是私有的,需要添加 --source
pod spec lint --use-libraries --allow-warnings --sources=xxx(私有库的名称就可以),https://cdn.cocoapods.org/

pod repo push

远程仓库验证成功,接下来需要将xxx.podspec文件提交到Cocoapods的私有库中

pod repo push XXX(远程库的名字) 本地项目的.podspec --allow-warnings 
如果引用第三方库是私有的,需要添加 --source
pod repo push xxx xxx.podspec --use-libraries --allow-warnings --sources=xxx(私有库的名称就可以),https://cdn.cocoapods.org/

发布完成使用

发布完成表示制作Cococapods私有库成功,如果其他项目需要依赖该模块,通过pod install方式就可以引用该模块,引用该模块的说话,需要在podfile上方添加pods仓库的源地址

source 'xxxx(第一步的远程仓库地址)'
source 'https://github.com/Cocoapods/Specs.git' (Cocoapods引擎库)
# CDN的truck,source修改为source 'https://cdn.cocoapods.org/'

即可引用成功

私有库更新

  • 修改本地Classes文件夹下的源码,修改完毕修改podspec的版本号,注意source_files的路径和新源码的依赖类库。
  • 在例子工程里pod update --no-repo-update
  • 本地编译成功,提交代码,打tag,与podspec一致
  • pod lint lint 或 pod spec lint验证
  • pod repo push xxx xxx.podspec --allow-warnings
  • 引用的项目下面pod update --no-repo-update即可看到库更新成功

打包Framework

pod package xxxx.podspec --no-mangle --force
如果引用第三方库是私有的,需要添加 --spec-source
pod package xxxx.podspec --no-mangle --force --spec-sources=xxx(私有库的git路径),https://cdn.cocoapods.org/

pod package的相关问题和解决办法看我pod package找不到命令

遇到的问题

Could not find remote branch xxx to clone.

tag的版本号与podspec不一致,或者远端的不一致

The repo … at … is not clean

本地的私有库仓库不干净,需要清理本地缓存。将本地repo中的该仓库删除,重新添加,然后再执行验证,push就可以了.

~/.cocoapods/repo #打开本地的总仓库,找到你的那个私有仓库,将整个文件夹删掉,清空废纸篓
pod repo add 私有库仓库名 私有仓库远程地址
pod lib lint ...
pod repo push ...

私有库更新不成功的问题

私有库发版成功后,需要在私有库工程中Example文件夹下 pod update,更新下私有库代码,接着再在需要引用该私有库的项目工程里pod install下,然后就可以看到私有库确实更新了,如果还没更新,可以将 Podfile 中“pod xxx”注释后 pod install 再取消注释后再 pod install,这样就可以实现更新了!

库的更新其实也就是功能文件或资源的更新。代码的更新必须要在“库名/classes”文件夹中进行!不要用Xcode在项目工程中的Pods/Development Pods/库名下面直接更新代码,这样做是无效的,因为这里只是库更新成功后,pod update后从本地pods仓库中拉取到的代码,这里不要进行写的操作,不然会导致库的异常,导致下一次更新后pod lib lint的失败!

如果是更新了代码部分,则需要先将代码push后再pod repo push。 发版成功后,需要pod repo update ops-xgn-ios-xgn,然后再在项目中引用。

An unexpected version directory ‘Assets’ was encountered for the /Users/yanyan/.cocoapods/repos/** Pod in the xxx repository.

可以进入指定文件夹repos把xxx删除即可
原因是source 'xxx(仓库地址)'意味着它希望它是一个规范仓库,但是您似乎正在尝试将规范仓库和该仓库中保存代码的仓库组合在一起,这是不受支持的。相反,您应该删除自定义source行,然后执行类似的操作pod 'xxx', :git => 'xxx(仓库地址)'。

git remote: You do not have permission push to this repository

没有在Podfile文件里添加私有库地址 source ‘xxx’

github和gitlab

github打开比较慢,有时候打开打不开的,我使用的是gitlab。

源码包含MRC文件

重点是必须对齐!!!与上面的s.xxx一定要对齐,sna里的也需要规范位置

non_arc_files = 'xxx/Classes/xxxx/xxx.{h,m}'
s.requires_arc  = true
s.exclude_files = non_arc_files
  
s.subspec 'no-arc' do |sna|
 sna.requires_arc = false
 sna.source_files = non_arc_files
end

'source_files' pattern did not match any file

source_files的路径是与podspec对齐的,所以从对齐的文件开始写路径,我这里报错是MRC的文件路径报错,具体到某个文件的.{h,m}就可以了。

xcodebuild: Returned an unsuccessful exit code. You can use --verbose for more information.

直接看ERROR下面的那行报什么错就可以了,我这里是提示找不到.h文件,加个.{h,m}就好了

No podspec found for xxx in xxx(git地址)

在项目中引用私有库时报错,把:path的引用修改为source的引用,然后把.cocoapods/repos/的私有库里的Classes和Assets删掉就可以pod install了。这个问题可以去上面按照我的方法,修改了文件名就不会出现这种情况了。

target has transitive dependencies that include statically linked binaries

使用了use_frameworks!,而且依赖库引用了静态库就需要 s.static_framework = true

引用其他的私有库,无法#import到

是因为没有在s.dependency引用到这个私有库

Encountered an unknown error (Unable to find a specification for xxxx depended upon by xxxx

pod lib lint或 pod spec lint 时候加上source,比如私有库NRBaseSpecs

pod lib lint --use-libraries --allow-warnings --sources=NRBaseSpecs,https://cdn.cocoapods.org/

参考

Cocoapods私有库使用
CocoaPods创建私有pod库(踩坑篇)