cocoaPods私有库创建以及使用,多重库引用
一、创建本地pod私有库
1.创建git私有库
在进行一切操作之前,先在内网创建一个git仓库。
这块我就不多做介绍啦,建库都会滴 ~~
https://xxxxxx/xxxx/iOSComponents/XXXXBaseIoTSocketManager.git
2.在本地创建工程
cd到你想要创建pod库工程的路径下,并执行pod库创建:
pod lib create XXX(库名)
如图1所示:
图1
回车,回答一下问题:
#选择使用平台
What platform do you want to use?? [ iOS / macOS ]
> iOS
#选择你想使用的变成语言
What language do you want to use?? [ Swift / ObjC ]
> ObjC
#是否创建一个demo工程,为了方便测试,选择Yes
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
#选择测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
#是否需要视图测试
Would you like to do view based testing? [ Yes / No ]
> Yes
#demo工程的class前缀
What is your class prefix?
> XXX
然后会弹出一个名为XXXBaseIotSocketManager-Example的工程,目录如图2所示:
图2
cd 到 Example 文件夹下, 安装CocoaPods项目
pod install --no-repo-update
进入Example文件夹点击.xcworkspace的文件夹打开项目,运行一下是否成功
如图3所示:
图3
二、编辑私有库
1.添加代码文件 & 资源文件 (复制粘贴)
如图4所示,XXXBaseIoTSocketManager目录下有两个文件夹,一个Assets,一个Classes文件夹,用来添加资源文件和代码文件。
把代码加进了Classes文件夹中,如下图4:
加进来应该后,工程应该如图5所示:
图5
如果工程目录中pod中,没有该索引的话,就自己加一下,如图6所示,如
图6
2.编辑.podspec配置文件
#
# Be sure to run `pod lib lint BOEBaseIoTSocketManager.podspec' to ensure this is a
# valid spec before submitting.
#
# Any lines starting with a # are optional, but their use is encouraged
# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html
#
Pod::Spec.new do |s|
#名称
s.name = 'XXXBaseIoTSocketManager'
#这一块看个人需求,想要的起始分支。-版本号
s.version = '1.0.0'
#剪短的介绍哟~
s.summary = '这里写你想要的简介。。。。'
# This description is used to generate tags and improve search results.
# * Think: What does it do? Why did you write it? What is the focus?
# * Try to keep it short, snappy and to the point.
# * Write the description between the DESC delimiters below.
# * Finally, don't worry about the indent, CocoaPods strips it!
#详细介绍
s.description = <<-DESC
这里写你想要的具体描述,有时候过短的话会有警告滴~~ 所以,不要逼summary短哟~~
DESC
#s.homepage里面写你的git主页,注意是没有.git的哟~~ 一定要能访问到,要不然验证不通过
s.homepage = 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager'
#截图
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
#开源协议
s.license = { :type => 'MIT', :file => 'LICENSE' }
#作者信息
s.author = { 'jiangsujia@126.com' => 'jiangsujia@126.com' }
#项目地址,不支持SSH的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
s.source = { :git => 'https://github.com/jiangsujia@126.com/XXXBaseIoTSocketManager.git', :tag => s.version.to_s }
#多媒体介绍地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
#支持的平台及版本
s.ios.deployment_target = '8.0'
#代码文件地址,**/*表示Classes目录及其子目录下所有的文件,如果有多个目录则用逗号分组显示,这里也要做相应的设置
s.source_files = 'XXXBaseIoTSocketManager/Classes/**/*'
#资源文件地址
# s.resource_bundles = {
# 'XXXBaseIoTSocketManager' => ['XXXBaseIoTSocketManager/Assets/*.png']
# }
#公开头文件
# s.public_header_files = 'Pod/Classes/**/*.h'
#buildsetting相关设置
#s.xcconfig = {
# 'ENABLE_BITCODE' => 'NO',
# 'CLANG_CXX_LIBRARY' => 'libstdc++'
#}
#该pod依赖的系统framework,多个用逗号分隔开
# s.frameworks = 'UIKit', 'MapKit'
#该pod依赖的系统Library,多个用逗号隔开
#s.libraries = 'sqlite3',
#第三方.a文件
#s.vendored_libraries = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.a'
#第三方frameworks文件
#s.vendored_frameworks = 'XXXBaseIoTSocketManager/Classes/ThirdParty/*.framework'
#依赖关系,该项目所依赖的其他库,如果有多个则需要填写多个s.dependency
s.dependency 'CocoaAsyncSocket', '~> 7.6.3'
end
3.更新依赖关系
配置完成后,再次cd到Example文件夹下,更新pod:
jiangsjdeiMac:Example jiangsj$ pod update --no-repo-update
更新完成后打开项目能否正常运行,并验证导入的文件是否能调用
Podfile如下:
use_frameworks!
platform :ios, '8.0'
target 'XXXBaseIoTSocketManager_Example' do
pod 'XXXBaseIoTSocketManager', :path => '../'
pod 'CocoaAsyncSocket', '~> 7.6.3'
target 'XXXBaseIoTSocketManager_Tests' do
inherit! :search_paths
pod 'FBSnapshotTestCase'
end
end
你会发现,实际上按照当前的podfile进行update后,会报错如下:
图7
建议先把下面这行在Podfile中注释了,然后执行update,但是你会发现目录下的Development Pods 没有了,然后再把这行打开,再update,就可以展示完整依赖了。
#先注释此行,pod update , 然后再打开注释, 再pod update
pod 'XXXBaseIoTSocketManager', :path => '../'
最终,终端如图8显示:
图8
三、提交到私有仓库
1.验证pod配置文件,为了保证项目正确性,pod文件配置没问题
1.cd 到你有XXXBaseIoTSocketManager.podspec的文件夹下
2.运行pod lib lint XXXBaseIoTSocketManager.podspec
ps:
1.如果出错了,就按照提示修复错误,但是有可能没有错有warnings,比如http什么的,
2.那么可以执行 pod lib lint XXXXBaseIoTSocketManager.podspec --allow-warnings
还有几个本地验证命令推荐如下:
#本地验证
pod lib lint
#本地验证+详细打印信息
pod lib lint --verbose
#本地验证+允许使用静态库
pod lib lint --use-libraries
#本地验证+允许警告
pod lib lint --allow-warnings
#本地验证+快速验证
pod lib lint --quick
整个过程如图9所示:
图9
由于我这里有警告所以我就用了--allow-warinings
图10
当出现XXX passed validation的时候,就验证通过了。
事实上如果你引用了一堆你私有的库而pod库search不到,这步lint就会出现问题。
我试过很多办法,仍旧是报错,其实,可以简化这步,如果你能保证你的库绝对没有问题,不执行lint也可以的。
2.发布项目到私有库中,此时切换公司内网。
1.添加远程仓库,就是之前我们在内网建的库
git remote add origin 你的仓库地址.git
2.添加文件
git add .
3.提交本地,并且添加描述
git commit -m "第一次提交"
4.推送本地代码到远程
git push origin master
5.打tag
git tag 1.0.0
6.推送tag到远程
git push origin 1.0.0
然后打开你的仓库地址,就可以看到我们的代码已经提交上去了,如图11。
图11
由于我上面.podspec文件填写的是branch是1.0.0,我又减了一个1.0.0分支。
3.创建Spec的管理库。
创建本地执行Spec命令
pod repo add XXXBaseIoTSocketManager(你的库名称) http://XXXX.git(你的库地址)
接下来就可以发布了
将自己的私有库添加到Spec管理中
pod repo push XXXBaseIoTSocketManager(你的库名称) XXXBaseIoTSocketManager.podspec
这步其实也不是必须的,因为我是将git管理clone到本地,所以本步骤省略也无所谓。
4.检验私有库的发布跟使用
在私有库引用了私有库的情况下,在验证和推送私有库的情况下都要加上所有的资源地址,不然pod会默认从官方repo查询。
pod spec lint --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
pod repo push 本地repo名 podspec名 --sources='私有仓库repo地址,https://github.com/CocoaPods/Specs'
5.引用自己或第三方的framework或.a文件
在podsepc中应该这样写:
s.ios.vendored_frameworks = "xxx/**/*.framework"
s.ios.vendored_libraries = "xxx/**/*.a”
6.私有库中添加资源(图片、音视频等)
方法有三种:
- 第一种
spec.resources = ["Images/*.png", "XXX/*"]
但是这些资源会在打包的时候直接拷贝的app的Bundle中,这样说不定会和其它资源产生命名冲突
- 第二种
spec.resource = "Resources/MYLibrary.bundle"
把资源都放在bundle中,然后打包时候这个bundle会直接拷贝进app的mainBundle中。使用的时候在mainBundle中查找这个bundle然后再搜索具体资源
NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"XXXBundle" withExtension:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithURL:bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
- 第三种
spec.resource_bundles = {
'xxxx' => ['Resources/*.png'],
'OtherResources' => ['OtherResources/*.png']
}
这种方法利用 framework 的命名空间,有效防止了资源冲突。
使用方法是先拿到最外面的 bundle,然后再去找下面指定名字 的 bundle 对象,再搜索具体资源
NSBundle *bundle = [NSBundle bundleForClass:[MYSomeClass class]];
NSURL *bundleURL = [bundle URLForResource:@"xxxx" withExtension:@"bundle"];
NSBundle *resourceBundle = [NSBundle bundleWithURL: bundleURL];
UIImage *img = [UIImage imageNamed:icon inBundle:bundle compatibleWithTraitCollection:nil];
7.检验私有库的发布跟使用
在项目中的Podfile中添加
pod 'xxxBaseIoTSocketManager', :git => 'http://xxxx/XXXBaseIoTSocketManager.git', :branch =>'1.0.0'
如下图12所示:
图12
、
工程如下13图所示:
图13
导入成功就可以使用了。
但是要注意的是,如果你要是在库中引用了三方库,那么你要提前在外网把三方库的引入在你的工程中引入一遍,注释后再切换到内网。如果你这个库引用了私有库,也一并pod进来就好了,注意是显式pod。
部分参考了如下,关于使用私有库遇到的问题,本文只做记录:
https://www.jianshu.com/p/1e5927eeb341