一、远程私有索引库创建(WeyanSpec)
1、创建远程私有索引库WeyanSpec(和创建远程工程一样),复制仓库地址(点击克隆/下载)
2、打开终端,将远程私有库关联到本地
cd ~/.cocoapods/repos
pod repo add WeyanSpec git@github.com:Yxw9106/WeyanSpec.git
这个时候~/.cocoapods/repos目录下面多了个WeyanSpec目录
二、私有代码仓库
1、创建文件夹EncryptionTools
2、本地私有代码库
# cd到指定的目录,这个EncryptionTools是自己创建的一个文件目录
cd /Users/xieweiyan//EncryptionTools
# 这里的EncryptionTools代表想要封装的组件名称, 这个根据自己的需求而定
pod lib create EncryptionTools
2.1、 在输入之后会有一些对组件工程的设置,具体如下:
What platform do you want to use?? [ iOS / macOS ]
>iOS
//开发语言设置,根据自己而定,这里为ObjC
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 ]
>No
//文件前缀
What is your class prefix?
>Weyan
2.2、创建完成过后,我们的工程会自动打开,创建完成后,工程的目录如下:
可以发现在Pods文件下面现在有一个EncryptionTools的文件夹,就是我们上面pod lib create EncryptionTools时候创建的文件夹名
2.3、添加功能的代码copy到Classes 目录中新建的EncryptionTools目录下,如下图所示
2.4、将添加的组件文件Pod到Example文件夹中
- 进入EncryptionTools>Example文件夹(有Podfile的文件夹)
- 执行 pod install 命令
- 执行完成后的工程目录
- 组件文件出现在Pods的工程中
2.6、配置.podspec文件,打开工程中的EncryptionTools.podspec
文件
#
# Be sure to run `pod lib lint EncryptionTools.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 = 'EncryptionTools' //1、组件名称
s.version = '0.1.0' //2、版本
s.summary = 'A short description of EncryptionTools.' //3、组件描述
# 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
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/xwy/EncryptionTools' //4、更换为github的仓库地址
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' } //5、监听
s.author = { 'xwy' => '17639605676@163.com' } //6、作者
s.source = { :git => 'https://github.com/xwy/EncryptionTools.git', :tag => s.version.to_s } //7、项目的远程仓库地址
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'
s.ios.deployment_target = '8.0' //8、iOS支持版本
#s.swift_version = '5.0' //如果组件使用swift语言开发的就要设置swift版本
s.source_files = 'EncryptionTools/Classes/**/*' //9、组件文件路径
# s.resource_bundles = {
# 'EncryptionTools' => ['EncryptionTools/Assets/*.png']
# } //10、资源包
s.public_header_files = 'Pod/Classes/**/*.h' //11、组件文件路径
#s.private_header_files = 'EncryptionTools/Classes/Core/EncryptionTools-Bridging-Header.h' //12、如果有桥接文件时设置
s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3' //13、依赖库,如果组件有依赖于其它组件,则需要放开此处注释,将组件引用进来,并且同时还需要在Podfile中添加依赖的组件,以保证项目能编译通过。
end
2.7、前往github或gitlab等等平台创建项目EncryptionTools
2.8、把本地的代码提交到远程仓库
- 在EncryptionTools工程根目录执行
git add .
git commit -m "提交说明"
git remote add origin 远程代码仓库地址
git push origin master 或(git push -u origin master)
git tag 版本号 (注:这里的版本号必须和podspec里写的版本号一致)
git push --tags
上面git remote add origin https://gitee.com/CuteHf/HFMyTest.git可能出现问题:
fatal: not a git repository (or any of the parent directories): .git
表示在当前指向的文件夹里找不到库(.git文件夹)
解决办法是对目录进行初始化
git init
git push -u origin master
error: src refspec master does not match any.
error: failed to push some refs to 'git@github.com:Yxw9106/EncryptionTools.git'
出现错误的主要原因是github的README.md文件不在本地代码目录中,可以通过如下命令进行代码合并[注:pull=fetch+merge]
git pull --rebase origin master
三、对文件进行本地验证和远程验证(在工程目录下)
1、从本地验证你的pod能否通过验证
pod lib lint --use-libraries --allow-warnings
--verbose
:有些非语法错误是不会给出错误原因的,这个时候可以使用--verbose来查看详细的验证过程来帮助定位错误。
--use-libraries
:表示使用静态库或者是framework,这里主要是解决当我们依赖一些framework库后校验提示找不到库的时候用到。
--allow-warnings
:表示允许警告。
2. 从本地和远程验证的pod能否通过验证
pod spec lint --use-libraries --allow-warnings
3. 将spec 文件提交到本地的私有仓库,然后再push到远程仓库
pod repo push SYPrivateSpecs SYIntelligentServicer.podspec --use-libraries --allow-warnings
4.若依赖有其他私有库时,验证pod库或push时使用:
pod spec lint EncryptionTools.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/CocoaPods/Specs.git,https://git.XXXXXo/modulization-mobile/SYPrivateSpecs.git'
pod repo push SYPrivateSpecs SYIntelligentServicer.podspec --verbose --allow-warnings --use-libraries --sources='https://github.com/CocoaPods/Specs.git,https://git.xxxx/modulization-mobile/SYPrivateSpecs.git'
四、我们可以使用trunk来发布组件到cocoapod/master,trunk需要CocoaPods 0.33版本以上
1、查看是否注册trunk
pod trunk me
2、注册命令
pod trunk register xxxxxxx@qq.com "userName" --verbose
注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下
3、发布到cocopod/master,在有.podspec文件的组件工程根目录执行
pod trunk push EncryptionTools.podspec --allow-warnings
**注:在使用cocoapods 上传自己的库时,执行命令:pod trunk push xxxx.podspec 命令报错:[!] Source code for your Pod was not accessible to CocoaPods Trunk. Is it a private repo or behind a username/password on http?
解决方案:将spec 文件中的 source 地址,使用 https 方式,不用使用 git 方式
**
4、发布完成之后搜索不到的问题解决办法
将组件在CocoaPods上面发布之后,使用pod search 组件名称却搜不到相关的信息,这个时候需要将cocoaPods的搜索缓存文件清理一下,然后重新使用pod search,就能得到最新的结果,
进入搜索CocoaPods缓存目录
cd ~/Library/Caches/CocoaPods
查看缓存文件search_index.json
ls
删除搜索缓存文件
rm -f search_index.json
注意:
1.私有库的子模块
如果你想引用一个私有库里面的一小部分功能,但是又不想把整个库导入,那么私有库的子模块正和你意
这里举例定义一个宏定义的子模块,里面是一些宏定义文件,外部可单独依赖这个子模块
#子模块的定义,也还是在.podspec文件中
#子模块 —— 宏定义
s.subspec 'Macro' do |submacro|
submacro.source_files = 'YMCommonViewLib/Classes/Macro/*.{h,m}'
end
#使用子模块时只需在podfile中添加 pod 'YMCommonViewLib/Macro' 即可
2.使用私有库组件开发技巧
在实际项目开发过程中,因为有些私有库在推送到索引库时时间可能会有10-20分钟,频繁的提交到索引库并不现实,而且不适合做私有库版本控制,所以这边建议主工程可依赖私有库的分支,而不是索引库对应的tag版本,到最后项目上线或者私有库需要定个版本的时候再打tag提交到索引库。
//主工程podfile
pod 'YMCommonViewLib',:git => 'http://****/ymcommonviewlib.git', :branch => 'branchName' #直接使用远程厂库的branchName最新提交,而不是通过ymspecrepo索引库中的tag标签
//还有一种方式,直接使用本地的仓库
# pod 'YMCommonViewLib',:path => '/Users/max/Project/YMCommonViewLib' #直接使用本地厂库, '/Users/max/Project/YMCommonViewLib' 是私有库在本地的目录,这种更方便于开发,在当前主工程项目里即可编译运行看到修改的效果。
如果想在私有库中添加像在PCH中导入的头文件,直接在Support Files下的prefix.pch中导入头文件,一旦在私有库工程中执行pod install操作,就会被重置,所以需要在.podspec文件中进行配置
3. pod私有库包含.a或.framework静态库的处理
//如果依赖有静态库,需要像以下方式添加依赖
s.vendored_libraries = 'YMCommonViewLib/Classes/Lib/*.{a}' //该目录下的.a静态库
s.vendored_framework = 'YMCommonViewLib/Classes/Framework/***.framework' //Framework目录下的***.framework静态库
s.static_framework = true //指定pod加静态库标签
3.1包含静态库在做验证和推送到索引库时时也要添加拼接一些命令
pod repo push YMSpecRepo YMCommonViewLib.podspec --allow-warnings --skip-import-validation --use-libraries --verbose --sources='https://github.com/CocoaPods/Specs.git,https://git.xxxxxx/modulization-mobile/SYPrivateSpecs.git'
3.2如果依赖的第三方有自己的私有库,在校验的时候需要指定source,后面要添加你索引库的地址
pod lib lint --sources=https://github.com/CocoaPods/Specs.git,http://******/ymspecrepo.git --allow-warnings --verbose --skip-import-validation
依赖第三方库
s.frameworks:依赖系统的动态库 比如 UIKit
s.vendored_framework:依赖非系统的动态库 比如TencentOpenAPI.framework
s.libraries:依赖系统静态库 比如libstdc++.a
s.vendored_libraries:依赖非系统的静态库 比如新浪微博的libWeiboSDK.a
s.dependency:依赖pod库
s.source_files:依赖的头文件
s.source_files = ['SYOnly/include/*.h','SYUnify/Classes/**/*']
s.frameworks = "AudioToolbox", "AVFoundation", "CoreTelephony", "SystemConfiguration", "GLKit"
s.vendored_libraries = "SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientLib/*.a"
s.vendored_libraries = [
'SOnly/libUMSPosPayOnly.a',
'SControl/libPaymentControl.a']
s.libraries = "sqlite3.0", "c++", "iconv.2.4.0", "z.1.2.5"
#s.resources = 'SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/**/*'
s.resources = ["SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientEASRResources/*.dat", "SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientResources/Tone/*.caf","SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/ASR/BDSClientResources/Theme/*.bundle","SYBaiDuSpeechSDK/SYBaiDuSpeechSDK/BDSClientResource/TTS/*.dat"]
s.requires_arc = true