Osheep

时光不回头,当下最重要。

从零用CocoaPods创建私有索引库

前言

什么是索引库?为什么要创建私有索引库?终端输入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获取最新代码

《从零用CocoaPods创建私有索引库》

TestLib/Classes
  • 创建远程私有库

由于github创建私有库需要付费,这里用coding进行演示

《从零用CocoaPods创建私有索引库》

远程私有库

这里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' => '123@qq.com' }
  s.source           = { :git => 'git@git.coding.net:coder_01/PrivateSpecs.git', :tag => s.version.to_s }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  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添加到账户

《从零用CocoaPods创建私有索引库》

添加公钥
git remote add origin git@git.coding.net: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

  • 创建私有索引库
《从零用CocoaPods创建私有索引库》

私有索引库
pod repo add PrivateSpecs git@git.coding.net:coder_01/PrivateSpecs.git
pod repo push PrivateSpecs TestLib.podspec

此时本地索引库长这样

cd ~/.cocoapods/repos
open .
《从零用CocoaPods创建私有索引库》

PrivateSpecs

最基本的制作到这里就完成了,现在能搜到TestLib这个库

pod search TestLib
《从零用CocoaPods创建私有索引库》

pod search

新建工程,pod init,修改podfile文件。这里需要添加两个source,一个原master repo,一个后添加的PrivateSpecs

source 'git@git.coding.net: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

《从零用CocoaPods创建私有索引库》

s.resource_bundles

但是,并不一定要把资源放到Assets文件夹下,可以是任意文件夹(如目录结构中的Classes或者新建),只要能找到资源即可。同样,如果包含资源s.source_files要这样写:

 s.source_files = 'TestLib/Classes/**/*{.h,.m}'

如果不这样写,若Classes中包含资源文件,会导致崩溃。此时先找到TestLib.bundle,再从这个bundle中加载资源就可以了

// 获取bundle资源
NSBundle *bundle = [NSBundle bundleForClass:[self class]];

podspec还有一些常用玩法,如subspecdependencyvendored_frameworksvendored_librariesprefix_header_contentsprefix_header_file

podspec更多配置可参考Podspec Syntax Reference

Have fun !

点赞