iOS开发经验 —— 封装私有pod

写在前面

说明:
两个私有库:
一个是私有代码库,存放需要pod封装的代码
一个是私有索引库,模拟cocoapods公共索引的库,通过这个索引找到私有代码库

步骤

1,根据命令提示创建工程

$ pod lib create CocoapodDemo

根据提问、提示创建一个demo工程


image

image

CocoapodDemo/CocoapodDemo/Classes中存放的就是Pod要包装的files

2,上传源码

把这个工程里的代码上传到远程私有代码库(没有的话新建一个)

3,创建索引库

新建一个远程仓库用于存放自己的私有库的 .podspec文件(私有索引库), 例如 git@github.com:yongqianvip/privatePodspec.git

通过下面的命令创建本地私有pod索引库

$ pod repo add privatePodspec git@github.com:yongqianvip/privatePodspec.git 

如果不行换用https://开头的链接 ,然后再看 .cocoapods/repos/ 文件夹下就多了一个privatePodspec文件夹,里面的master文件夹是pod公共索引库,包含成千上万的pod索引,privatePodspec就是模拟这个公共索引库的私有索引库

image

4,功能实现

到这里,私有代码库和私有索引库都创建完毕,接下来就是功能实现,想要实现什么功能,把相应的功能实现文件、头文件等放入CocoapodDemo/CocoapodDemo/Classes目录下,在Example文件夹下的工程中进行测试,然后一并上传到远程代码库

image

5,编辑CocoapodDemo.podspec文件

这个应该无需过多解释,主要配置好sourcesource_files,更多参数送传送门http://guides.cocoapods.org/syntax/podspec.html

image

6,验证CocoapodDemo.podspec文件

$ pod lib lint

在CocoapodDemo.podspec文件所在目录下执行上面的命令,如果验证通过会显示

image

如果有ERROR一定要先修改错误,如果是可以忽略的警告加 --allow-warnings 参数

文末列出了几个错误,可以参考,也欢迎补充。。。

7,打tag提交代码

podspec验证通过之后,私有代码库打tag提交

$ git tag '0.0.1'
$ git push --tags

tag 要和 .podspec文件中的version一致

8,添加到本地索引库

$ pod repo push privatePodspec CocoapodDemo.podspec

注意: 如果lint的时候添加了 --allow-warnings --use-libraries 等参数的话,push的时候也要加上

image

9,验证

$ pod search RRCLogin

image

如果之前步骤都成功,但是验证环节报错
[!] Unable to find a pod with name, author, summary, or description matching 'RRCLogin'
可能是缓存的问题,清理cocoapodsearch缓存

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

再执行search(清理search的缓存之后再搜索时间会有点儿长)

10,使用我们上传的私有pod

在需要引用这个库的工程的Podfile中添加

source 'https://github.com/CocoaPods/Specs.git' 
source 'https://github.com/yongqianvip/privatePodspec.git' 

这是为了告诉pod,检索依赖的时候既要检索公共索引库,咱们本地的私有索引库也要检索

总结

这里是借助公开库 模拟私有库的pod封装,我们的索引没有推送到cocoapod远程库,假想一下,如果我们的这两个仓库都是私有的,那么别人就搜不到我们的代码,就实现了真正的私有pod

pod lib lint 时遇到的一些ERROR

错误 NO.1

  Building with xcodebuild. 
xcodebuild clean build -workspace /var/folders/nc/2btst88j1dn9spsydgzy94m80000gp/T/CocoaPods-Lint-20180301-68829-1lc144r-RRCLogin-Inhouse/App.xcworkspace -scheme App -configuration Release CODE_SIGN_IDENTITY=- -sdk iphonesimulator -destination id=EF5C4592-DA0A-40C4-B14A-040C9934FA86 
Build settings from command line: 
    CODE_SIGN_IDENTITY = - 
    SDKROOT = iphonesimulator11.2 

xcodebuild: error: Unable to find a destination matching the provided destination specifier: 
        { id:EF5C4592-DA0A-40C4-B14A-040C9934FA86 } 

    Available destinations for the "App" scheme: 
        { platform:iOS, id:3364f575ca6f4054e91f7273bbf1dfcd057a4786, name:YYQ的 iPhone } 
        { platform:iOS Simulator, id:B461000D-7668-4984-969E-F4A6F2B5F822, OS:11.0.1, name:iPad (5th generation) } 
        { platform:iOS Simulator, id:274C9F62-9F24-4A68-97FA-F58ACBD752D8, OS:11.2, name:iPad (5th generation) } 
        { platform:iOS Simulator, id:A5594DF0-938B-4AD3-A2E4-D9DF0C462206, OS:11.2, name:iPhone 5s } 
        { platform:iOS Simulator, id:0443319F-6EF8-49CF-A93F-0EACA18B1BAB, OS:11.2, name:iPhone 6 } 
        { platform:iOS Simulator, id:6B8AB42A-32BB-476C-B93A-796D0A5F0D1B, OS:11.2, name:iPhone 6 Plus } 
        { platform:iOS Simulator, id:25F0DBDA-4F38-4004-AA01-8250302B466B, OS:11.2, name:iPhone 6s } 
        { platform:iOS Simulator, id:177042D1-C48E-4F0E-A285-F155B7D2A608, OS:11.2, name:iPhone 6s Plus } 
        { platform:iOS Simulator, id:FA65D37F-74A6-40C9-817E-9C929D660348, OS:11.2, name:iPhone 7 } 
        { platform:iOS Simulator, id:2DD23829-DC3C-49B5-822E-D859B0B03E5C, OS:11.2, name:iPhone 7 Plus } 
        { platform:iOS Simulator, id:A24F0CBF-55B5-46B2-9B4A-36FFD6C4E7D1, OS:11.2, name:iPhone 8 } 
        { platform:iOS Simulator, id:E84B2668-BC88-42FA-8A4E-FF731AA52383, OS:11.2, name:iPhone 8 Plus } 
        { platform:iOS Simulator, id:770C7323-027A-45EF-87E4-C07DECA5B116, OS:11.2, name:iPhone SE } 
        { platform:iOS Simulator, id:1368D6CC-FE26-4403-BD4F-B6FDD6AFE47F, OS:11.2, name:iPhone X } 

    Ineligible destinations for the "App" scheme: 
        { platform:iOS, id:dvtdevice-DVTiPhonePlaceholder-iphoneos:placeholder, name:Generic iOS Device } 
        { platform:iOS Simulator, id:dvtdevice-DVTiOSDeviceSimulatorPlaceholder-iphonesimulator:placeholder, name:Generic iOS Simulator Device } 
   Testing with xcodebuild. 
-> RRCLogin-Inhouse (0.1.0) 
    - WARN  | url: There was a problem validating the URL http://gitlab.renrenche.com/DQD_IOS_module/RRCInhouseLogin. 
    - ERROR | [iOS] xcodebuild: Returned an unsuccessful exit code. 
    - NOTE  | [iOS] xcodebuild:  xcodebuild: error: Unable to find a destination matching the provided destination specifier: 

[!] RRCLogin-Inhouse did not pass validation, due to 1 error and 1 warning. 
You can use the `--no-clean` option to inspect any issue. 

这个错误目前还不清楚原因,初步推测是环境变量的问题,为了解决这个错误,我换了台电脑、我换了台电脑、我换了台电脑

错误 NO.2

- ERROR | xcodebuild:  /Users/YYQ/Library/Developer/Xcode/DerivedData/App-aajotsmzgxneapbmwyfqevaamvpu/Build/Products/Release-iphonesimulator/RRCLogin-Inhouse/RRCLogin_Inhouse.framework/Headers/RRCPayNetworkHttpResponse.h:10:9: error: include of non-modular header inside framework module 'RRCLogin_Inhouse.RRCPayNetworkHttpResponse': '/Users/YYQ/Library/Developer/Xcode/DerivedData/App-aajotsmzgxneapbmwyfqevaamvpu/Build/Products/Release-iphonesimulator/JSONModel/JSONModel.framework/Headers/JSONModel.h' [-Werror,-Wnon-modular-include-in-framework-module] 

这个错误是文件引用的问题,我的代码中用到了JSONModel,引用的方式是 #import "JSONModel.h”,但是JSONModel是通过s.dependency 'JSONModel’, ‘~> 1.5.1’的方式,引入的,那么我自己的代码中使用JSONModel就应该是用尖括号的形式引入了
#import <JSONModel.h>这是不对的,应该用#import <JSONModel/JSONModel.h>,否则会有下边的错
https://github.com/CocoaPods/CocoaPods/issues/5715

错误 NO.3

- ERROR | [iOS] xcodebuild:  /Users/YYQ/RRC/Podmodules/RRCLogin-Inhouse/RRCLogin-Inhouse/Classes/login/GETVerificationVoiceCodeRequest.m:11:9: error: 'JSONModel.h' file not found with <angled> include; use "quotes” instead 

这个错误是路径的问题,我的代码中用到了JSONModel,引用的方式是 #import <JSONModel.h>,改成#import <JSONModel/JSONModel.h> 就可以了

错误 NO.4

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries: (/private/var/folders/m7/7t1r7_993fbgs40fppwxrsm80000gn/T/CocoaPods-Lint-20180301-60100-1meifl-Payment/Pods/openssl-ios-bitcode/lib/libcrypto.a and /private/var/folders/m7/7t1r7_993fbgs40fppwxrsm80000gn/T/CocoaPods-Lint-20180301-60100-1meifl-Payment/Pods/openssl-ios-bitcode/lib/libssl.a)) during validation. 

依赖了其他库,lint 检查的时候添加后缀

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

推荐阅读更多精彩内容