CocoaPods进阶:详解私有库制作

一、前言

自己一直想用CocoaPods制作pod库,在自己面试过程中也被面试官问到过组件化开发的概念,然尔自己那时也不是很了解,CocoaPods与组件化也息息相关,利用CocoaPods也便于维护pod组件,于是自己就决定学习用CocoaPods制作pod库,下面就开始讲解私有库的制作过程吧。

二、目录

  • 安装CocoaPods
  • 创建远程内部私有Spec Repo仓库
  • 模板创建pod库
  • 编辑***.podspec文件
  • 验证本地是否通过
  • 关联本地仓库,并推送到远程仓库,打标签
  • 推送***.podspec到远程spec仓库
  • 验证远程是否通过
  • 验证私有仓库是否可用,pod集成私有库

安装CocoaPods

首先要安装CocoaPods,没有安装可以参考我的博客CocoaPods安装与使用

创建远程内部私有Spec Repo仓库

这步自己采坑不少,一开始自己并不理解,不知到代码仓库和Spec Repo是需要分开存储的。好了,不说自己经历的曲折了,如果你还没有创建远程内部私有Spec Repo仓库, 需要到Github,码云或其他代码托管平台创建远程仓库, 之后将远程仓库克隆到本地,终端执行如下命令:

//这里可以用https或ssh地址方式克隆
pod repo add WBSpecs git@github.com:wenmobo/WBSpecs.git

克隆之后,本地cocoapods目录如下:

[图片上传失败...(image-1f8ed3-1585582297672)]

模板创建pod库

  • 第二步:在本地任意一个文件夹下创建pod库:

    pod lib create WBAvoidCrash
    

    之后控制台输出

    [图片上传失败...(image-6a900c-1585582297672)]

    接着会需要回答一些问题:

    # 你想使用哪个平台?
    1、What platform do you want to use?? [ iOS / macOS ]
    iOS
    # 库语言选择?
    2、What language do you want to use?? [ Swift / ObjC ]
    ObjC
    # 你要使用哪个测试框架?
    3、Which testing frameworks will you use? [ Specta / Kiwi / None ]
    None
    # 是否要UI测试?
    4、Would you like to do view based testing? [ Yes / No ]
    NO
    # 类名前缀?
    5、What is your class prefix?
    WB
    

    成功之后,目录如下:

    [图片上传失败...(image-da3c7d-1585582297672)]

    工程目录如下:

    [图片上传失败...(image-28c98f-1585582297672)]

  • 在工程WBAvoidCrash目录添加我们的代码文件:

    [图片上传失败...(image-46b0a5-1585582297672)]

    添加完成之后如下:

    [图片上传失败...(image-fb161f-1585582297672)]

    注意:代码文件需要添加到WBAvoidCrash/Classes目录下。

编辑***.podspec文件

Pod::Spec.new do |s|
  #库名称
  s.name             = 'WBAvoidCrash'
  
  #指定支持的平台和版本,不写则默认支持所有的平台,如果支持多个平台,则使用下面的deployment_target定义
  spec.platform = :ios
  
  #版本号
  s.version          = '1.0.0'
  
  #库简短介绍
  s.summary          = 'iOS 防Crash库'
  
  #开源库描述 
  s.description      = ""
                       
  # 开源库地址,或者是博客、社交地址等
  s.homepage         = 'https://github.com/wenmobo/WBAvoidCrash'
  
  # 开源协议
  s.license          = { :type => 'MIT', :file => 'LICENSE' }
  
  # 开源库作者
  s.author           = { 'wenmobo' => 'wenmobo2018@gmail.com' }
  
  # 开源库GitHub的路径与tag值,GitHub路径后必须有.git,tag实际就是上面的版本
  s.source           = { :git => 'https://github.com/wenmobo/WBAvoidCrash.git', :tag => s.version }
  
  # 社交网址
  s.social_media_url = 'http://blogwenbo.com/'
  
  # 开源库最低支持
  s.ios.deployment_target = '8.0'
  
  # 源库资源文件
  s.source_files = 'WBAvoidCrash/Classes/**/*'
  
  # 是否支持arc
  s.requires_arc = true
  
  # ---------------- Dependency --------------
  #开源库依赖库
  s.dependency "Masonry"
  # 指定版本
  s.dependency "Masonry", "~> 1.0"
  
  # ---------------- Project Linking ----------------
  # 添加系统依赖静态库
  s.library = 'sqlite3', 'xml2'
  
  #依赖系统库
  s.frameworks = 'Foundation'
  
  #添加依赖第三方的framework
  s.vendored_frameworks = 'XXXX/XXXX/**/*.framework'
  
  #静态库.a
  s.vendored_library = 'XXXX/XXX/XXX.a', 'YYY/YYY/Y.a'
  
  # ---------------- Resource ------------------
  s.resource  = "icon.png"
  s.resources = "Resources/*.png"
  s.resource_bundles = {
   'ATCategory' => ['ATCategory/Images/*.png']
  }
  
  #添加资源文件
  s.resource = 'XXX/XXXX/**/*.bundle'
  
  # ---------------- Project Setting ----------------
  s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
  
  # pod工程配置,指模拟器指令集配置
  ss.pod_target_xcconfig = {
    'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
  }
  
  # 在 podspec 文件中添加 s.static_framework = true,CocoaPods 就会把这个库配置成static framework。同时支持 Swift 和 Objective-C
  s.static_framework = true
  
  # ---------------- Subspec ----------------
  s.subspec 'sub' do |ss|
    ss.source_files = 'WBAvoidCrash/Classes/**/*'
  end
  
end
  • 关于s.source_files写法
//表示匹配WBAvoidCrash/Classes下所有文件(主目录和子目录,其中**相当于省略中间层级)
'WBAvoidCrash/Classes/**/*'
//表示匹配Classes所有以.h和.m结尾的文件
'WBAvoidCrash/Classes/*.{h,m}'
//表示匹配所有WBAvoidCrash目录下文件,不包含子目录
'WBAvoidCrash/*'

更多关于资源目录层级写法可以参考GitHub一些著名框架,AFNetworking.podspecZFPlayer.podspec等。

  • s.dependency关于依赖三库,依赖多个三方库如下:

    s.dependency 'Masonry'
    s.dependency 'MJRefresh'
    s.dependency 'Masonry' 'YYModel'
    

验证本地是否通过

  • 配置好podspec之后,验证本地库是否通过验证,终端输入如下命令:
pod lib lint

通过验证,终端输出如下:

[图片上传失败...(image-7d62bf-1585582297672)]

  • 报如下错误
屏幕快照 2018-08-14 上午12.21.07.png

需在Xcode中配置:

屏幕快照 2018-08-14 上午12.34.17.png
  • 如果pod库存在警告是不能通过验证的,如果要暂时忽略警告通过验证(如码云创建的私有库s.homepage地址不可达警告),可使用如下命令:
pod lib lint --allow-warnings
  • 你制作的pod库依赖三方库,而三方库包含静态库(如:xxxx.a),在验证的时候,不能验证通过,可使用如下命令:

  • pod lib lint --use-libraries
    
    //同时忽略警告
    pod lib lint --use-libraries --allow-warnings
    

不管怎样都要解决pod库存在的警告,并通过验证。

关联本地仓库,并推送到远程仓库,打标签

  • 如果你还未创建远程仓库,你需要创建与之对应的远程仓库,我是在GitHub创建的仓库,这里也不再赘述创建方法。创建之后须与本地仓库关联,在终端执行如下命令:
#提交代码到暂存区
git add .
#提交到本地仓库
git commit -m "create WBAvoidCrash Library"
#添加到远程仓库
git remote add origin git@github.com:wenmobo/WBAvoidCrash.git
#推送到远程仓库
git push origin master
  • 最近在用码云制作私有库的时候按照上面git命令,在执行git push origin master会报错,需要执行以下命令或者按终端提示的信息操作,第一次才能成功推送到远程仓库:

  • git pull --rebase origin master
    
  • 提交完成之后进行打标签操作:

#打标签
git tag -a 1.0.0 -m 'release version 1.0.0'
#推送标签到远程
git push origin 1.0.0

友情提示

关于git打标签操作,你可以借助Sourcetree或者终端命令,可以查看我的博客MAC上Git打标签

推送***.podspec到远程

首先将本地WBAvoidCrash.podspec推送到远程私有repo spec仓库和本地repo spec仓库,终端执行如下命令:

cd [WBAvoidCrash库路径]
pod repo push WBSpecs WBAvoidCrash.podspec

[图片上传失败...(image-f0bc8e-1585582297672)]

验证远程是否通过

推送成功之后,终端输入如下命令进行验证:

pod spec lint WBAvoidCrash.podspec

验证通过终端输出如下:

[图片上传失败...(image-5274bf-1585582297672)]

  • 同样这里如果还存在着警告或者错误,同样不能验证通过,同样可以用以下命令忽略警告通过验证:

    pod spec lint WBAvoidCrash.podspec --allow-warnings
    pod spec lint WBAvoidCrash.podspec --use-libraries
    pod spec lint WBAvoidCrash.podspec --allow-warnings --use-libraries
    

验证私有仓库是否可用,pod集成私有库

验证通过之后,下面进行测试,看是否能通过cocoapods集成到我们的项目,首先用pod命令进行搜索,看能否搜索到:

pod search WBAvoidCrash

这时可能会报如下错误

[图片上传失败...(image-b4dc9a-1585582297672)]

不要慌,在终端执行如下命令,然后重新search:

rm ~/Library/Caches/CocoaPods/search_index.json

耐心等待之后,发现能搜到自己创建的私有库了:

[图片上传失败...(image-7a504d-1585582297672)]

新建一个测试工程测试,用CocoaPods初始化项目,编辑podfile文件:

#CocoaPods官方spec仓库
source 'https://github.com/CocoaPods/Specs.git'
#自己私有spec仓库
source 'https://github.com/wenmobo/WBSpecs.git'

platform :ios, '8.0'

target 'Test' do
  #防Crash库
  pod 'WBAvoidCrash'

  # Pods for Test

  target 'TestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'TestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end

编辑好podfile文件之后,终端执行:

pod install
或
pod install --no-repo-update

耐心等待一会儿,你会发现私有库已经集成到测试项目中了:

[图片上传失败...(image-77cf4b-1585582297672)]

到这里,cocoapods私有库制作已讲解完成。也为自己制作的第一个私有库打波广告吧☺️☺️,WBAvoidCrash一个防Crash库,现在支持9种防崩溃类型,集成方便,使用无需导入相关的头文件,这个库之前没这么完善,后来参考借鉴了一些大神开源的库。下面👇贴出私有库地址吧:

WBAvoidCrash

三、相关命令

cocoapods

  • 查看所有repo

    pod repo list
    
  • 移除某个repo

    pod repo remove [spec]
    
  • 更新repo

    # 更新所有repo
    pod repo update
    # 更新指定
    pod repo update [spec库名]
    
  • 验证可选参数

    --quick                                Lint skips checks that would require
                                               to download and build the spec
    --allow-warnings                       Lint validates even if warnings are
                                         present
    --subspec=NAME                         Lint validates only the given subspec
    --no-subspecs                          Lint skips validation of subspecs
    --no-clean                             Lint leaves the build directory
                                         intact for inspection
    --fail-fast                            Lint stops on the first failing
                                         platform or subspec
    --use-libraries                        Lint uses static libraries to install
                                         the spec
    --use-modular-headers                  Lint uses modular headers during
                                         installation
    --sources=https://cdn.cocoapods.org/   The sources from which to pull
                                         dependent pods (defaults to
                                         https://cdn.cocoapods.org/). Multiple
                                         sources must be comma-delimited
    --platforms=ios,macos                  Lint against specific platforms
                                         (defaults to all platforms supported
                                         by the podspec). Multiple platforms
                                         must be comma-delimited
    --private                              Lint skips checks that apply only to
                                         public specs
    --swift-version=VERSION                The `SWIFT_VERSION` that should be
                                         used to lint the spec. This takes
                                         precedence over the Swift versions
                                         specified by the spec or a
                                         `.swift-version` file
    --include-podspecs=**/*.podspec        Additional ancillary podspecs which
                                         are used for linting via :path
    --external-podspecs=**/*.podspec       Additional ancillary podspecs which
                                         are used for linting via :podspec. If
                                         there are --include-podspecs, then
                                         these are removed from them
    --skip-import-validation               Lint skips validating that the pod
                                         can be imported
    --skip-tests                           Lint skips building and running tests
                                         during validation
    --analyze                              Validate with the Xcode Static
                                         Analysis tool
    --silent                               Show nothing
    --verbose                              Show more debugging information
    --no-ansi                              Show output without ANSI codes
    --help                                 Show help banner of specified command
    

    可通过如下命令查看可选参数

    pod lib lint --help
    
  • 验证本地pod库

    # 验证本地pod库
    pod lib lint
    # 本地验证忽略警告
    pod lib lint --allow-warnings
    
  • 验证远程

    #验证远程
    pod spec lint [name].podspec
    
  • 搜索pod库

    pod search [库名]
    

四、问题解决

4.1、JPush制作私有库lint时报错 symbol(s) not found for architecture i386

valid_archs = ['armv7s','arm64',]
s.xcconfig = {
  'VALID_ARCHS' =>  valid_archs.join(' '),
}
s.pod_target_xcconfig = {
    'ARCHS[sdk=iphonesimulator*]' => '$(ARCHS_STANDARD_64_BIT)'
}

4.2、私有库依赖私有库验证不通过

--sources=[private spec],[cocoapods spec]
# 如下写法
pod lib lint --no-clean --sources=https://xxx.git,https://github.com/CocoaPods/Specs.git --allow-warnings --use-libraries --use-modular-headers --verbose

五、结语

终于完成这篇博客了,从自己比较熟悉GitHub之后,也想过自己能够开源一款三方库,然而自己水平有限,现在还没有拿的出来好的封装库或一些好的封装思想。但自己还是要学会制作pod库,在写博客之前,自己在谷歌浏览器查了许多的资料,资料也是比较的凌乱,自己在制作过程中也踩了许多的坑,最后自己也成功制作了一个私有库WBAvoidCrash,过程虽然有些坎坷,但自己还是很有成就感。自己也是第一次制作,如果有描述不对的地方,希望大家能够批评指正,我也会第一时间修改,同时也希望这篇博客对需要的朋友一些帮助,接下来我也会写一篇记录公开库制作过程的博客。

六、参考文章

1、 CocoaPods创建公有和私有Pod库方法总结
2、出现Unable to find a pod with name, author, summary, or description matching解决方法
3、如何发布自己的开源框架到CocoaPods
4、使用CocoaPods管理iOS库---制作pod篇
5、如何创建私有 CocoaPods 仓库
6、Making a CocoaPod
7、Create and Distribute Private Libraries with Cocoapods
8、CocoaPods使用总结

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

推荐阅读更多精彩内容