摘要:静态库一堆目标文件的打包体并非二进制文件。加载静态库启动时,动态库使用时启动后。四其它插件参考链接插件安装及说明参考链接官网安装教程文件的具体说明发布开源库到官方仓库动态库和静态库分析
声明:
最后更新时间:2019年3月18日
为保证时效性,持续更新地址为:Cocopods安装和使用
一、安装和使用Cocopods网上已有很多教程,参考示例:CocoaPods安装教程
二、让自己的组件库支持pod方式引入 1.创建远程代码仓库创建远程代码仓库(并不是podspec文件的仓库),此仓库放的是源代码。可以在GitHub上创建仓库。
2.创建远程specs仓库如果要发布到Cocopods的官方specs仓库(公开的官方specs仓库),那么就不需要创建。当然私有库是需要创建的(创建方式和远程代码仓库一样,只不过specs放的是podspec文件),在这一步两者不一样。
公开库参考示例:发布开源库到Cocopods官方仓库
可以使用pod命令创建,得到一个工程模板,并且可以根据需要配置工程,如下:
命令创建工程模板
pod lib create <组件库名>
工程配置选择
选择平台
What platform do you want to use?? [ iOS / macOS ]
iOS
选择语言
What language do you want to use?? [ Swift / ObjC ]
ObjC
是否自动生成一个用来做demo测试的模板库,建议Yes,后面方便测试
Would you like to include a demo application with your library? [ Yes / No ]Yes
是否集成测试框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
UI 测试
Would you like to do view based testing? [ Yes / No ]
No
指定类前缀
What is your class prefix?
WT
工程创建之后,就可以添加代码文件到组件库的class目录,图片资源到asset目录,不过要注意资源的引用方式是不是一个bundle(参考链接:资源文件)
4.编写podspec文件如果用第三步的命令创建工程模板,那么在Podspec Metadata目录下已经自动生成了。如果是已有的工程或者库文件目录,也可以利用Pod命令自己制作.podspec文件,命令如下:
pod spec cretae <组件库名>
参考链接:podspec文件的具体说明
注意:自动生成的podspec文件只是模板,需要结合工程的库文件、资源目录、远程代码仓库(第一步创建的远程代码仓库)修改补充podspec文件。
5.验证podspec文件命令如下:
pod lib lint (从本地验证你的pod能否通过验证)6.本地测试库是否可用
pod spec lint (从本地和远程验证你的pod能否通过验证,⚠️ 需要更新提交podspec到远程specs仓库,参考第8步,一般本地验证通过即可提交到远程specs仓库)
pod lib lint --verbose (加--verbose可以显示详细的检测过程,出错时会显示详细的错误信息)
pod lib lint --allow-warnings (允许警告,用来解决由于代码中存在警告导致不能通过校验的问题)
pod lib lint --sources=https://git.xxx.com/windtersh... (私有库依赖需要添加specs源)
pod lib lint --help (查看所有可选参数,可选参数可以加多个)
新建工程,切换到工程目录,执行命令
pod init
修改podfile文件, 并添加上本地库路径
pod "库名", :path => "/Users/xxx/Documents/库名"
拉取pod代码:成功后可看到我们的库并没有在pods里面,而是在Development Pods里面,可用先检测代码有没有问题。
7.提交工程代码提交工程代码到远程代码仓库,可以利用git或者svn进行代码版本管理,提交代码到GitHub等, 初始化提交命令如下:
初始化git版本管理仓库,模板代码已经初始化了(有.git文件夹),此步骤可以忽略
git init
添加到暂存区
git add .
提交到本地仓库
git commit -a -m "Initial project"
打标签,注意此标签可能在podspec中用到,用于区分版本
git tag 0.0.1
本地仓库与远程仓库关联
git remote add origin
拉取和合并本地与远程仓库
git pull origin master --allow-unrelated-histories
本地仓库代码推送到远程
git push --set-upstream origin master
推送标签
git push --tags8.提交podspec文件
开源库提交podspec文件到Cocopods官方仓库, 当然需要现在ocopods官方仓库中注册账号,命令如下:
pod trunk me (检查是否注册trunk)
pod trunk register <邮箱> <注册名字> --verbose (注册命令)
注册完成之后会给你的邮箱发个邮件,进入邮箱邮件里面有个链接,需要点击确认一下.之后开始提交,切换到有.podspec文件的组件工程根目录执行命令
pod trunk push <组件库名>.podspec
pod trunk push <组件库名>.podspec --allow-warnings
私有库提交podspec文件到远程specs仓库(第二步创建的specs远程仓库),和Cocopods官方库不同的是,私有仓库需要先添加到本地仓库,再push到远程仓库,因为Cocopods默认已经添加到了本地仓库(默认为master),Mac系统可以查看文件目录(~/.cocoapods/repos), 私有库命令如下:
添加到本地仓库, git@git.xxxx/.git为远程specs库的地址,成功之后目录(~/.cocoapods/repos)除了master之外,新增了一个文件夹(<组件库名>)
pod repo add
查看是否添加成功
pod repo list
push到远程specs仓库
pod repo push9. 检查仓库是否发布成功<组件库名>.podspec
pod搜索一下:
pod search <组件库名>
如果报错,搜索不到,建议更新下pod:
pod update
之后仍然搜索不到,那么进入CocoaPods缓存目录,删除缓存索引文件search_index.json:
cd ~/Library/Caches/CocoaPods10. pod库文件引入
ls
rm -f search_index.json
如果是开源库(公有的),修改podfile文件:
pod "组件库名"
如果是私有仓库,建议在podfile文件开头添加source源:
source "https://github.com/CocoaPods/Specs.git" #官方远程仓库地址 source ‘http://xxx/组件库.git’ #私有podspecs远程仓库地址
最后执行命令进行安装:
pod install三、Cocoapods-packager插件打包库 1.静态库和动态库
文件形式:
常见形式:静态库常见的是 .a,动态库常见的是 .dll(windows),.dylib(mac),tbd(mac,Xcode7开始),so(linux)
framework(Apple)形式: Framework 是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。 framework其实是资源打包的方式,和静态库动态库的本质是没有关系。
静态库和动态库区别:
静态库:链接时会被完整的复制到可执行文件中,所以如果两个程序都用了某个静态库,那么每个二进制可执行文件里面其实都含有这份静态库的代码。
动态库: 链接时不复制,在程序启动后用dyld加载,然后再决议符号,所以理论上动态库只用存在一份,好多个程序都可以动态链接到这个动态库上面,达到了节省内存(不是磁盘是内存中只有一份动态库),还有另外一个好处,由于动态库并不绑定到可执行程序上,所以我们想升级这个动态库就很容易,windows和linux上面一般插件和模块机制都是这样实现的。注意:苹果开发中如果你把某个自己开发的动态库(系统的不算,毕竟苹果是爸爸)放在了Linked Frameworks and Libraries里面,程序一启动就会报Reason: Image Not Found,你只能把它放在Embeded Binaries里面才能正常使用。
静态库:一堆目标文件(.o/.obj)的打包体(并非二进制文件)。
动态库: 一个没有main函数的可执行文件。
静态库和动态库如何构建和加载
编译: 将我们的源代码文件编译为目标文件。
链接: 将我们的各种目标文件加上一些第三方库,和系统库链接为可执行文件。链接这一步最主要的操作就是决议符号的地址。若符号来自静态库(本质就是.o 的集合包)或 .o,将其纳入链接产物,并确定符号地址。若符号来自动态库,打个标记,等启动的时候再说---交给dyld去加载和链接符号。
加载:静态库启动时,动态库使用时(启动后。
静态库和动态库的依赖关系
静态库之间保持独立
可执文件(主程序或者动态库)在构建的链接阶段遇到静态库吸附进来(吸附性) ,遇到动态库打标记(彼此保持独立)。 注意:如果不想让动态库吸附静态库,可以把静态库包一层变成动态库。
查看Framework是否是动态库
在framework目录之下,如果带有dynamically标识着是动态库, 否则是静态库,运行命令
file xxxx.framework
参考链接:iOS动态库和静态库分析
2.安装打包插件通常可以通过Xcode(Xcodebuild)来打包静态库和动态库,现在通过Cocopods插件(脱离Xcode)来打包
直接通过gem命令安装
sudo gem install cocoapods-packager
找到 Gemfile文件,添加下面一行:
gem "cocoapods-packager"
然后运行命令
bundle install2.打包库
运行打包命令,注意在podspec文件的目录下, 默认生成静态framework形式,并且类名和方法名会被加组件库的前缀避免冲突(比如:SDK引入AFNetworking,自己的项目中也引用 AFNetworking,SDK通过此种方式打包会被添加前缀,如:PodWTNetworking_AFURLSessionManager)
pod package xxxx.podspec
可以添加命令参数,运行一下命令查看
pod package --help
--force :强制覆盖之前已经生成过的二进制库
--no-mangle :不添加符号前缀(因为默认是添加前缀,避免冲突,如:PodWTNetworking_AFURLSessionManager)
--exclude-deps : 不包含依赖的符号表,生成动态库的时候不能包含这个命令,静态库一定需要包含依赖的符号表。
--embedded :生成静态.framework
--library : 生成静态.a(默认目录下只有.a,头文件需要自己整理)
--dynamic : 生成动态framework
--configuration=Debug :表示生成的库是debug还是release,默认是release
--spec-sources=https://xxxxx.git,https://github.com/CocoaPods/... :依赖库的远程specs,特别当依赖的库是私有仓库specs时需要添加
示例:
pod package WTNetworking.podspec --spec-sources=https://git.dev.tencent.com/w...://github.com/CocoaPods/Specs.git --force --library
⚠️注意: 默认的符号添加前缀可能会造成问题:
参考另一个插件说明:cocoapods-mangle README.md,本人在测试的时候出现了问题,cocoapods-mangle插件直接处理AFNetworking就会报错中不到属性变量什么的(这个变量是id类型,并遵循某个协议),由于时间原因没有继续探究(本人当前主要探究一个App多个SDK都引用OpenSSL 造成冲突的问题,哪位大佬有好的方案请下方留言),但是打包插件cocoapods-packager确没什么问题(测试过程发现packager会给类和常量添加前缀,不会给分类方法添加前缀)。
C语言格式的函数: 本人测试“AFQueryStringFromParameters”是可以的并不会冲突。
打包SDK依赖的时候,建议头文件的引用写在.m文件中,比如:SDK 引用了AFNetworking ,但是把【#import "AFNetworking.h"】 写在了.h文件中并在打包的时候暴露了出来,但是在项目中有没有直接用到AFNetworking,那么就会提示找不到AFNetworking。
四、Cocopods其它插件参考链接:Cocopods插件安装及说明
参考链接Cocopods官网
CocoaPods安装教程
podspec文件的具体说明
发布开源库到Cocopods官方仓库
iOS动态库和静态库分析
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/17227.html
摘要:年月日更新是什么是开发和应用程序的一个第三方库的依赖管理工具。利用可以定义自己的依赖关系称作并且随着时间的变化以及在整个开发环境中对第三方库的版本管理非常方便背后的理念主要体现在两个方面在工程中引入第三方代码会涉及到许多内容。 2016年7月4日更新 CocoaPods 是什么? CocoaPods 是开发 OS X 和 iOS 应用程序的一个第三方库的依赖管理工具。利用 Coco...
摘要:若此目录下已有项目,则会将项目更新到最新的状态。这时就需要我们手动安装。若直接从上下载文件,由于缺少文件,会导致不使用。若用,由于文件过大,容易导致失败。但是使用软件,则会提高的成功率,并且会给出的进度。 本文写于2016年9月,安装Cocoapods 用于iOS开发,可直接用Mac上的终端从GitHub上将第三方框架应用到工程中,接下来的安装配置基于上一篇文章《在Mac OS X上安...
摘要:解决在文件中,多页面配置默认是单页面效果,首先,真正运行的是,通过作为入口文件文件,通过,将文件打包成进行使用。多页面的重点,就是将独立页面的文件,生成多个文件。的入口和出口配置参考文件,创建一个,作为的入口,用于生成页面。 前言 RN weex hippy taro 1.Weex与RN 比较 showImg(https://segmentfault.com/img/bVbvfFL?w...
摘要:解决在文件中,多页面配置默认是单页面效果,首先,真正运行的是,通过作为入口文件文件,通过,将文件打包成进行使用。多页面的重点,就是将独立页面的文件,生成多个文件。的入口和出口配置参考文件,创建一个,作为的入口,用于生成页面。 前言 RN weex hippy taro 1.Weex与RN 比较 showImg(https://segmentfault.com/img/bVbvfFL?w...
摘要:注个人总结出的最好方式是使用,没有用过的请参看之前的文章。第三方框架为例。用到的文件中需要第三方库是库,导入到项目。如果第三方库是,不需要直接可用如果第三方库是,在头文件中添加。第三方库是库,粘贴到项目。 注1:文章写于2016年9月,(swift 3.0、Xcode 8)不同版本可能不同,仅作参考。注2:个人总结出的最好方式是使用cocoapods,没有用过的请参看之前的文章。 OC...
阅读 2249·2021-11-19 09:40
阅读 3396·2021-10-12 10:12
阅读 1682·2021-09-22 15:04
阅读 2798·2021-09-02 09:53
阅读 652·2019-08-29 11:03
阅读 1026·2019-08-28 18:11
阅读 1525·2019-08-23 15:28
阅读 3454·2019-08-23 15:05