从零用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获取最新代码

TestLib/Classes

  • 创建远程私有库

由于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' => '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添加到账户

添加公钥
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

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

此时本地索引库长这样

cd ~/.cocoapods/repos
open .
PrivateSpecs

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

pod search TestLib
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

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 !

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容