前言
什么是索引库?为什么要创建私有索引库?终端输入pod repo
,如果之前没有配置过,输出信息为:
master
- Type: git (master)
- URL: https://github.com/CocoaPods/Specs.git
- Path: /Users/Jack/.cocoapods/repos/master
浏览器打开https://github.com/CocoaPods/Specs,可以看到一个Specs文件夹,文件夹内包含目前所有支持CocoaPods框架的索引,但https://github.com/CocoaPods/Specs.git
是公开索引库,只能添加公开(开源)框架,如果想让私有框架支持CocoaPods,这个时候必须用私有索引库。
正文
如果私有框架已经存在,只需进入对应本地项目根目录,创建podspec填写正确信息后上传,并将podspec文件push到私有索引库即可。
pod spec create [podspec文件名] //创建podspec
pod lib lint //podspec本地验证
pod spec lint //podspec远程验证
git add .
git commit -m xx
git push origin master
pod repo push [私有索引库] [podspec文件] //将podspec文件push到私有索引库
如果从零开始创建私有框架,可以按以下步骤执行:
(以下均以TestLib为例,请自行替换)
终端进入准备创建lib的文件夹,执行命令
pod lib create TestLib
这个过程可能需要等待几秒,之后会出现如下信息:
What language do you want to use?? [ Swift / ObjC ]
Would you like to include a demo application with your library? [ Yes / No ]
Which testing frameworks will you use? [ Specta / Kiwi / None ]
Would you like to do view based testing? [ Yes / No ]
根据提示输入即可,完成后会自动打开TestLib对应的Example工程
执行tree命令查看目录结构
01:TestLib Jack$ tree TestLib -L 2
TestLib
├── Example
│ ├── Podfile
│ ├── Podfile.lock
│ ├── Pods
│ ├── TestLib
│ ├── TestLib.xcodeproj
│ ├── TestLib.xcworkspace
│ └── Tests
├── LICENSE
├── README.md
├── TestLib
│ ├── Assets
│ └── Classes
├── TestLib.podspec
└── _Pods.xcodeproj -> Example/Pods/Pods.xcodeproj
10 directories, 5 files
将组件放入TestLib/Classes中,并删除ReplaceMe.m,进入Example文件夹执行pod install
后,TestLib对应的Example工程已经装载好,可以进行demo演示。以后每次更新lib,都需要进到Example中执行pod install
获取最新代码
- 创建远程私有库
由于github创建私有库需要付费,这里用coding进行演示
这里README.md、开源许可证、gitignore都不需要添加,从上面TestLib的目录结构可以看到,pod lib create
已经创建了这三个文件,如果添加,在commit时候会导致冲突(文件内容不完全相同),所以只要创建一个最干净的私有库。
- 修改podspec文件
Pod::Spec.new do |s|
s.name = 'TestLib'
s.version = '0.1.0'
s.summary = 'TestLib'
s.description = <<-DESC
TestLib只是一个演示
DESC
s.homepage = 'https://coding.net/u/coder_01/p/TestLib'
# s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { '01_Jack' => '[email protected]' }
s.source = { :git => '[email protected]:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/'
s.ios.deployment_target = '8.0'
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.public_header_files = 'Pod/Classes/**/*.h'
# s.frameworks = 'UIKit', 'MapKit'
# s.dependency 'AFNetworking', '~> 2.3'
end
- 对podspec进行本地验证:
pod lib lint --private
如果因为waring验证不通过可以加上--allow-warnings
,远程验证和pod repo push
同理
- 打包
验证通过后打包类库,这里可以用cocoapods的插件cocoapods-packager来完成(手动打包太麻烦)。如果之前没有安装cocoapods-packager,执行以下命令:
sudo gem install cocoapods-packager
打包:
pod package TestLib.podspec --force
默认打包成.framework
,如果加上--library
则打包成.a
。
验证通过后,通过git status
可查看当前git改变状态,不需要提交的文件可添加到gitignore中。
git status
git add .
git commit -m 'first blood'
到这里已经可以将代码提交到远程仓库,但需要先添加仓库地址再提交
- 添加公钥
ssh-keygen
将生成的公钥id_rsa.pub添加到账户
git remote add origin [email protected]:coder_01/TestLib.git
git push origin master
在对podspec做远程验证前要先push tag,tag必须与podspec中的version一致
git tag 0.1.0
git push --tags
pod spec lint --private
远程验证通过后,将TestLib.podspec push到远程私有索引库,同样,需要先添加仓库再push
- 创建私有索引库
pod repo add PrivateSpecs [email protected]:coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec
此时本地索引库长这样
cd ~/.cocoapods/repos
open .
最基本的制作到这里就完成了,现在能搜到TestLib这个库
pod search TestLib
新建工程,pod init
,修改podfile文件。这里需要添加两个source,一个原master repo,一个后添加的PrivateSpecs
source '[email protected]:coder_01/PrivateSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
target 'Test' do
pod 'TestLib'
end
执行pod install
即可使用TestLib
框架
Tip:如果组件中含有图片、音视频、xib/storyboard等,podspec的描述与代码中的写法都需要改变
重新回到podspec文件
s.source_files = 'TestLib/Classes/**/*'
# s.resource_bundles = {
# 'TestLib' => ['TestLib/Assets/*.png']
# }
s.source_files
用来找代码,s.resource_bundles
用来找资源。
TestLib/Classes/**/*
表示匹配TestLib/Classes文件夹下所有子目录的所有文件
Pattern:*
-
*
匹配所有文件 -
c*
匹配所有以c开头的文件 -
*c
匹配所有以c结尾的文件 -
*c*
匹配所有包含c的文件
Pattern: **
-
**
递归匹配所有子文件夹
未组件化前,加载图片、音视频、xib/storyboard等资源可通过mainBundle来加载,现在要通过组件自带bundle来获取资源。TestLib会自动将s.resource_bundles
下指定的路径资源打成bundle包,并命名为TestLib.bundle
但是,并不一定要把资源放到Assets文件夹下,可以是任意文件夹(如目录结构中的Classes或者新建),只要能找到资源即可。同样,如果包含资源s.source_files
要这样写:
s.source_files = 'TestLib/Classes/**/*{.h,.m}'
如果不这样写,若Classes中包含资源文件,会导致崩溃。此时先找到TestLib.bundle
,再从这个bundle中加载资源就可以了
// 获取bundle资源
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
podspec还有一些常用玩法,如subspec
、dependency
、vendored_frameworks
、vendored_libraries
、prefix_header_contents
、prefix_header_file
等
podspec更多配置可参考Podspec Syntax Reference
Have fun !