cocoaPods私有库创建以及使用,多重库引用

2020-02-04  本文已影响0人  黄易女民工jiang

一、创建本地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:

图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

上一篇下一篇

猜你喜欢

热点阅读