iOS 发布CocoaPods私有库

  • 需要做的工作包括以下几点
  1. 创建一个本地的仓库,将自己的代码搞进去
  2. 将自己的代码上传到远程私有仓库中去
  3. 创建一个pods 的描述文件 .podspec
  4. 修改.podspec描述文件中的相关的描述信息
  5. 创建远程内部私有Spec Repo仓库
  6. 向私有的Spec Repo仓库中提交.podspec
  7. 在个人项目中的Podfile中增加刚刚制作的好的Pod并使用
  8. 后期的升级维护
  • 具体详细的步骤如下
    1. 创建远程仓库注意点
  • 正规的仓库都有一个license文件,Pods依赖库对这个文件要求比较严格,需要有这个文件,建议使用MIT类型的license,没有MIT后面pod验证会有警告
  • 代码版本要打tag(要在代码版本上传以后打tag)
  • pod 支持 .a静态库、.framework 以及文件,不一定要是可运行的工程里面的某个组件
  • 放代码的仓库不一定非要是Git仓库,只要是可以获取到相关代码文件就可以,可以是SVN的,也可以是zip包,区别就是在podspec中的source项填写的内容不同
  1. 创建一个pods 的描述文件 .podspec
  • 如果你已经有先有工程可以使用如下命令直接创建.podspec文件$ pod spec create MyViewExtension<这个名称一般和创建的项目名称一样就可以>
  • 或者使用如下命令创建完整项目工程目录$ pod lib create MyViewExtension <这个名称一般和创建的项目名称一样就可以>使用这个命令会询问如下问题,根据项目情况选择即可
  1. 修改.podspec描述文件中的相关的描述信息
    详情可参考CocoaPods的官网的PodSpec语法
Pod::Spec.new do |s|
  # 项目的名称
  s.name             = "MyViewExtension"   
  # 项目的版本号,通过项目git的tag标签进行对应,这里的标签代表的版本 
  s.version          = "0.0.1"    
  # 项目简单的描述信息        
  s.summary          = "Just Testing."  
  # 项目的详细描述信息,注意,这里的文字的长度,一定要比上面的s.summary长,不然会认为格式不合格
  s.description  = <<-DESC
                      this project provide all kind of KeychainDeviceID for iOS developer 
                   DESC
  # 项目的网页主页信息,这里可以直接写自己的远程仓库的主页的地址
  s.homepage         = "https://github.com/RunOfTheSnail/MyViewExtension"
  # 开源协议
  s.license          = "MIT"   
  # 作者信息          
  s.author             = { "zhangyan" => "17***24@163.com" }                   
  # 这个比较重要,指的就是git的对应的远程仓库的地址以及版本号,版本号直接获取的是上面的s.version
  # 项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
  # Supported Keys:
  # :git => :tag, :branch, :commit, :submodules
  # :svn => :folder, :tag, :revision
  # :hg => :revision
  # :http => :flatten, :type, :sha256, :sha1
  s.source       = { :git => "https://github.com/RunOfTheSnail/MyViewExtension.git", :tag => s.version }                      
  # 支持的平台及版本
  s.platform     = :ios, "11.0"
  # 支持的ios最低版本
  s.ios.deployment_target = "7.0"
  # 如果是 Swift 的话指定 Swift 编译版本
  # s.swift_version = "4.0"
  # 必备项,代码源文件地址,如果有多个目录下则用逗号分开,否则"public_header_files"等不可用
  s.source_files  = "GSLXYKeychainDeviceID/KeychainDeviceID/**/*.{h,m}"                               
  # 公开头文件地址
  # s.public_header_files = "Pod/Classes/**/*.h"
  # 所需的系统framework,多个用逗号隔开,不需要后缀名
  # s.ios.framework  = "SomeFramework"
  s.frameworks = "UIKit", "AnotherFramework"
  # 需要弱链接的框架
  # s.weak_framework = "Twitter"
  # s.weak_frameworks = "Twitter", "SafariServices"
  #项目依赖的库文件(这个是系统的库文件),不需要后缀名,比如sqlite,libz等.以lib开头的需要省略掉lib这三个字母.例如:libz需要简写为z否则报错
  # s.ios.library   = "iconv"
  # s.libraries = "iconv", "xml2"
  # 第三方或自己创建的 .Framework的名称
  # s.vendored_frameworks = "YostarLib.framework"
  # 第三方或自己创建的 .a静态库的名称
  # s.vendored_libraries = "libYostarStaticLib.a"
  # 添加资源文件
  # s.resource = "XXX/XXXX/**/*.bundle"
  # s.resources = "XXX/XXXX/**/*.bundle"
  # CocoaPods会把这个库配置成static framework,同时支持Swift和Objective-C
  # s.static_framework = true
  # 依赖关系,该项目所依赖的其他,当在加载的时候也会一块把相关的依赖的库加载下来,如果有多个需要填写多个
  # s.dependency "JSONKit", "~> 1.4" 
  # 是否使用ARC,如果指定具体文件,则具体的文件使用ARC      
  s.requires_arc = true
  # 指定项目配置,如HEADER_SEARCH_PATHS、OTHER_LDFLAGS等
  # s.xcconfig = {"OTHER_LDFLAGS" => "-ObjC"}
  # s.user_target_xcconfig = {"OTHER_LDFLAGS" => "-ObjC", "LD_RUNPATH_SEARCH_PATHS" => "/usr/lib/swift", "LIBRARY_SEARCH_PATHS" => "$(SDKROOT)/usr/lib/swift $(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)"}
  # s.pod_target_xcconfig = { 'VALID_ARCHS' => 'arm64 x86_64 armv7' }
  # s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64 i386' }
end
  • 补充说明:
    xcconfig:修改pod SDKPod 生成的.a 库引用主工程的配置
    user_target_xcconfig:修改Pod 生成的.a 库引用主工程的配置
    pod_target_xcconfig:只修改pod SDK的配置
    xcconfig = user_target_xcconfig + pod_target_xcconfig
    现在官方已经没有xcconfig这个字段的说明了

  • 修改完毕之后进行检验一下.podspec的格式有木有问题

$ pod lib lint
完整lint格式
$ pod lib lint --allow-warnings --use-libraries --verbose --no-clean --sources='http://10.11.180.29/mobileDevelopers/YZT-Loan-Pod-Spec.git'
$ pod lib lint GSCoreKit.podspec --allow-warnings --use-libraries --verbose --no-clean  检查指定podspec
--verbose:打印错误
--allow-warnings:允许警告,默认有警告的podspec会验证失败
--fail-fast:遇到错误马上停止,默认会完成全过程再停止
--use-libraries:如果自己私有库包含library,引用了.a、.framework,在验证和提交时需要加
--no-clean:检查问题
--sources:如果依赖了其他不包含在官方specs里的pod,则用它来指明源(repo库不是源码库),比如依赖了某个私有库。多个值以逗号分隔
--skip-import-validation:跳过验证
  1. 创建远程内部私有Spec Repo仓库
    创建远程内部私有Spec Repo仓库, 需要到Github或其他代码托管平台创建远程仓库, 之后将远程仓库克隆到本地,终端执行如下命令:
// 这里可以用https或ssh地址方式克隆
$ pod repo add WBSpecs https://github.com/G***00/TestPodspec.git

注意:代码仓库和Spec Repo是需要分开存储的
克隆成功之后,我们可以查看一下:$ open ~/.cocoapods/repos
本地cocoapods目录如下:

  1. 向私有的Spec Repo仓库中提交.podspec
  • 首先将本地.podspec推送到远程私有repo spec仓库和本地repo spec仓库,终端执行如下命令:$ pod repo push WBSpecs WBAvoidCrash.podspec 参数解析:repo spec仓库名称 .podspec名称
  • 验证远程是否通过
    推送成功之后,终端输入如下命令进行验证$ pod spec lint WBAvoidCrash.podspec
  • 验证私有仓库是否可用
    用pod命令进行搜索,看能否搜索到:$ pod search WBAvoidCrash
    如果搜索不到,在终端执行如下命令$ rm ~/Library/Caches/CocoaPods/search_index.json或者更新本地仓库$ pod repo update然后重新search
  1. 在个人项目中增加刚刚制作好的Podfile并使用
    新建一个测试工程测试,用CocoaPods初始化项目,编辑Podfile文件:
#CocoaPods官方spec仓库
source 'https://github.com/CocoaPods/Specs.git'
#自己私有spec仓库
source 'https://github.com/wenmobo/WBSpecs.git'

platform :ios, '8.0'

target 'TestDemo' do
  #防Crash库
  pod 'WBAvoidCrash'
end

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

$ pod install 安装时使用,更新库使用update命令
或
$ pod update 更新时使用
  1. 后期的升级维护
    8.1. 更新远程私有库中的代码
    8.2. 修改.podspec中的配置,version升级一个版本
    8.3. 给当前的远程仓库的代码,重新打个tag,tag和.podspec的version一样
    8.4. 远程仓库的代码更新完毕,接下来执行上面的 6.将当前本地的spec文件传到私有Spec Repo仓库的索引库中
    8.5. 检查测试一下,有没有上传到私有Spec Repo仓库的索引库中
  • 删除私有的Spec Repo$ pod repo remove [name]
    该命令只是删除了本地的repo仓库,要删除远程repo库,需要同步推送远程仓库
    或者直接找到本地repo库,手动删除也行,然后再将Git的变动push到远端仓库即可

  • 清理CocoaPods本地缓存
    特殊情况下,由于网络或者别的原因,通过CocoaPods下载的文件可能会有问题

  1. 手动删除(~/Library/Caches/CocoaPods/Pods/Release目录)

  2. 打开终端,输入$ pod cache list,会列出所有本地已经缓存的第三方库,在终端中输入$ pod cache clean AAA会删除AAA缓存库,使用$ pod cache clean --all清除所有缓存

  • pod lib lint 验证失败
** BUILD FAILED **
The following build commands failed:
Ld ***/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64

建议根据使用的Framework形式进行设置
XCFramework设置pod_target_xcconfig
Framework设置user_target_xcconfig

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64 i386' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64 i386' }
  • 相同版本的repo可以更新,不用提升repo版本
    repo仓库已经有版本存在,但是需要修改该版本,不需要提升tag版本,直接修改.podspec,推送repo即可,如果该版本已经使用,建议升级tag版本

  • .podspec必须和要引用的工程文件在同一级别目录下,pod是以.podspec目录为起始参考,不支持../返回上一目录级别的操作

  • 注意:对于.a库,pod要求以lib为开头格式,如果不是,可以自行在.a库,添加lib即可

  • 私有repo仓库和cocoapods公有库原理一样,可以存放很多不同源码版本库的podspec,并不是一个私有库就要对应一个Repo私有仓库,具体看个人需求,二者关系如下图:

附:我的博客地址

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

推荐阅读更多精彩内容