美文网首页生活必备cocoapodsiOS Developer
从零用CocoaPods创建私有索引库

从零用CocoaPods创建私有索引库

作者: 01_Jack | 来源:发表于2017-06-17 10:57 被阅读888次
前言

什么是索引库?为什么要创建私有索引库?终端输入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 !

相关文章

  • 创建私有库

    在GitHub上创建私有库,并使用cocoapods导入使用 1、创建索引库 创建远程索引库 创建本地索引库 1)...

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

    前言 什么是索引库?为什么要创建私有索引库?终端输入pod repo,如果之前没有配置过,输出信息为: 浏览器打开...

  • Swift 码云创建私有库

    一:创建私有库的索引库先看一张图 二:将创建的索引库添加到本地cocoapods仓库1.cocoapods本地仓库...

  • CocoaPods使用总结

    CocoaPods 公共库的创建CocoaPods 本地私有库的创建(模板创建方式)CocoaPods 本地私有库...

  • 远程私有库步骤

    创建 1、自己的远程私有库的索引库添加到 cocoapods的索引库 2、 创建pod模版库 3、将要抽离的写好...

  • cocoapods私有库笔记

    构建私有库 索引库:存放索引地方私有库:存放代码地方 1.构建索引库 1.1 构建Cocoapods管理 1.1....

  • ios 私有库创建

    一.创建私有库的索引库 1.git上创建私有索引库 拿到私有库的索引地址(https://github.c...

  • iOS创建私有库

    iOS创建私有库 创建本地私有库索引和远程私有库索引关联 pod repo addSGSpecshttp://12...

  • iOS组件化1 之 创建远程私有仓库

    一、创建私有索引库 二、本地添加私有索引库 三、创建组件库 四、上传组件代码 五、提交podspec到私有索引库 ...

  • 使用Cocoapods创建私有podspec

    参考文章: CocoaPods私有库配置笔记 使用Cocoapods创建私有podspec cocoapods应用...

网友评论

  • 简书lu:我现在是把storyboard转化为bundle了,然后podspec是这样写的s.resource_bundles = {
    'LBCityChooseView' => ['LBCityChooseView/Classes/LBCityChooseView.bundle']
    }
    我想知道在代码里面怎么加载这个Storyboard啊
  • 简书lu:Storyboard文件也是这样// 获取bundle资源
    NSBundle *bundle = [NSBundle bundleForClass:[self class]];加载吗
  • 简书lu:TestLib会自动将s.resource_bundles下指定的路径资源打成bundle包,并命名为TestLib.bundle

    这句话的意思是不需要我们自己将资源文件转化为bundle文件吗

本文标题:从零用CocoaPods创建私有索引库

本文链接:https://www.haomeiwen.com/subject/suguqxtx.html