组件化之podspec文件

如何创建podspec

创建podspec文件只需要一行命令,在你自己的三方库的根目录下输入下面的命令:

pod spec create XXXModule

podspec文件内容介绍

image.png

一些常用信息的介绍

name:框架的名字
version:当前版本(注意,是当前版本,假如你后续更新了新版本,需要修改此处,以后打的tag,保持和versin)
summary:简要描述,在pod search ZCPKit的时候会显示该信息。
description:详细描述
homepage:页面链接
license:开源协议
author:作者
source:源码git地址
platform:支持最低ios版本
source_files:源文件(可以包含.h和.m)
public_header_files:头文件(.h文件)
resources:资源文件(配置的文件都会被放到mainBundle中)
resource_bundles:资源文件(配置的文件会放到你自己指定的bundle中)
frameworks:依赖的系统框架
vendored_frameworks:依赖的非系统框架
libraries:依赖的系统库
vendored_libraries:依赖的非系统的静态库
dependency:依赖的三方库

介绍一下,里面一些重要的配置信息

source_files:配置三方库的源文件(.h或.m文件)
写法:
source_files = 'XhmModule/Classes/xhmKit.{h,m}' // 直接指定文件名
source_files = 'XhmModule/Classes/*.{h,m}' // Classes文件夹下的所有匹配文件
source_files = 'XhmModule/Classes/**/*.{h,m}' // Classes所有路径下的所有匹配文件
source_files = 'XhmModule/Classes/**/*' //表示匹配所有文件(主目录和子目录,其中**相当于省略中间层级)
source_files = 'XhmModule/Classes/*' //表示匹配所有classes目录下文件,不包含子目录的
source_files = 'XhmModule/Classes/NSURLSession/*.{h,m} ' //表示匹配NSURLSession所有以.h和.m结尾的文件

public_header_files:配置公有的头文件(.h文件)
写法:
public_header_files = 'XhmModule/Classes/xhmKit.{h,m}' // 直接指定文件名
public_header_files = 'XhmModule/Classes/*.h' // Classes文件夹下的所有匹配文件
public_header_files = 'XhmModule/Classes/**/*.h' // Classes所有路径下的所有匹配文件
vendored_frameworks:配置需要引用的非系统框架
写法:
vendored_frameworks = 'XhmModule/Frameworks/xhmFramework.framework'
frameworks:配置依赖的系统框架
写法:
frameworks = 'AVFoundation', 'CoreGraphics'
vendored_libraries:配置需要引用的非系统静态库(要注意,这里的.a静态库名字必须要带lib前缀,如果引用的静态库名字没lib前缀会导致编译报错,只需要重命名加上即可)
写法:
vendored_libraries = 'XhmModule/Frameworks/libXhmKit.a'
libraries:配置依赖的系统库(要注意,这里的写法需要忽略lib前缀)
写法:
libraries = 'c++', 'sqlite3', 'stdc++.6.0.9', 'z'
resources:配置资源文件(.bundle,.png,.txt等资源文件,这些资源文件会被放到mainBundle中,要注意避免发生命名重复的问题)
写法:
resources = 'Resources/MyRes.bundle'
resource_bundles:配置指定bundle的资源文件(可以解决resources导致的命名冲突问题)(推荐使用该方式配置资源)
写法:
spec.resource_bundles={
   'MyLibrary'=>['Resources/*.png'],
   'OtherResources'=>['OtherResources/*.png']
 }

s.resource_bundles = {
'XhmModule' => ['XhmModule/Assets/*.png', 'XhmModule/Assets/pic/*.png']
}
dependency:依赖的三方库,pod库或者可以是自身的subspec
写法:
dependency 'AFNetworking', '~>4.0.0' // pod三方库
dependency 'XhmModule/Tools' // 自身的subspec 使用的是层级路径
dependency 'AFNetworking'

目录分层实现

目录分层的好处:

目录分层,结构清晰;
使用pod引入一个三方库时,可以只引入一个subspec而不用将整个三方库引入。

下面举列说明,如图所示目录结构:


image.png

image.png

写法如下:

Pod::Spec.new do |s|
s.name             = 'XhmModule'
s.version          = '0.1.0'
s.summary          = '创建自定义的私有库'

# 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://gitee.com/xhm121'
# s.screenshots     = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2'
s.license          = { :type => 'MIT', :file => 'LICENSE' }
s.author           = { 'hou.xiahou' => 'min.xiahou@renren-inc.com' }
s.source           = { :git => 'https://gitee.com/xhm121/hmprivate-pods.git', :tag => s.version.to_s }
# s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

s.ios.deployment_target = '9.0'

s.source_files = 'XhmModule/Classes/*'
s.public_header_files = 'XhmModule/Classes/CommonHeader.h'

s.subspec 'Tools' do |ss| 
    ss.source_files = 'XhmModule/Classes/Tools/*'
    s.dependency 'SDWebImage', '~> 5.12'
end

s.subspec 'Base64' do |ss|
    ss.source_files = 'XhmModule/Classes/Base64/*'
end 

s.subspec 'MD5' do |ss|
    ss.source_files = 'XhmModule/Classes/MD5/*'
    ss.dependency 'XhmModule/Tools'
end 


s.resource_bundles = {
'XhmModule' => ['XhmModule/Assets/*.png', 'XhmModule/Assets/pic/*.png']
}

end

效果:


image.png

有几个需要注意的地方:

1.层级不能出现循环依赖

比如类Base64Additions.h中 #import "NSString+MD5.h",同时NSString+MD5.h中 #import "Base64Additions.h"。
这样当写podspec时就需要在Base64层级中写,dependency 'XhmModule/MD5',在MD5层级中写dependency 'XhmModule/Base64'。如此便存在Base64与MD5层级之间的循环依赖。出现循环依赖时,三方库是无法成功提交到repo上的,会报依赖错误。解决办法是,使用 public_header_files,创建CommonHeader文件在该文件中把相互引用的文件包含进去,例如
s.public_header_files = 'XhmModule/Classes/CommonHeader.h'

2.不同层级需要引用文件的时候,得添加依赖(排除相互依赖的情况下)

例如:MD5层级中的NSString+MD5.m引用了Tools层级中的文件,应该给MD5层级添加依赖,如下

s.subspec 'MD5' do |ss|
    ss.source_files = 'XhmModule/Classes/MD5/*'
    ss.dependency 'XhmModule/Tools'
end 
3.source_files使用的是真实的物理路径,而dependency依赖其他层级时使用的是层级路径,不是真实的物理路径

例如:UIImage+MyLibrary.h文件的真实路径是:XhmModule/Classes/Tools,而Tools层级是属于XhmModule层级下的一个子subspec,所以当写MD5层级依赖Util层级时要写:dependency 'XhmModule/Tools'而不是dependency 'XhmModule/Classes/Tools'

如何校验podspec文件

在podspec写好之后我们需要验证一下编写的内容是否有误。可以在命令行的三方库当前路径下使用下面的命令:

pod lib lint (从本地验证你的pod能否通过验证)
pod spec lint (从本地和远程验证你的pod能否通过验证)

pod lib lint --verbose (加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息)
pod lib lint --allow-warnings (允许警告,用来解决由于代码中存在警告导致不能通过校验的问题)
pod lib lint --help (查看所有可选参数,可选参数可以加多个)
// 跳转到XhmModule.podspec 目录下去执行
pod repo push XhmModule XhmModule.podspec --allow-warnings

podspec验证相关参数的作用:

--allow-warnings : 忽略警告,即可以允许有警告也可以通过验证
--use-libraries: 使用静态库安装规范,当包含依赖的第三方或自定义的静态库需要添加此规范
--use-modular-headers: 如果是OC和swift 的混编需要加上
--sources=https://cdn.cocoapods.org/: 指定索引库的源,多个源必须用逗号分隔
--local-only: 不执行将回购推到其远程服务器的步骤
--no-private: 包括仅适用于公共回购的检查
--skip-import-validation: 跳过验证pod是否可以导入
--skip-tests: 在验证期间跳过构建和运行测试
--commit-message="Fix bug in pod": 添加自定义提交消息。如果没有指定提交消息,则打开默认编辑器
--use-json: 在将其推送到repo之前,将podspec转换为JSON
--swift-version=VERSION: 在标记规范时应该使用的SWIFT_VERSION。这优先于规范中指定的Swift版本或. Swift版本文件
--no-overwrite: 不允许将覆盖现有规范的推送

iOS组件化之pod加载资源文件
iOS项目组件化遇到的问题及解决(100%遇得到)
podspec官方网站
Podspec语法参考 v1.2.0.beta.1
podspec 校验报错问题指南

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

推荐阅读更多精彩内容