制作cocoapods私有仓库(一)依赖库制作

前言
制作cocoapods私有仓库 首先是依赖库的制作,然后才是cocoapods私有仓库的制作

依赖库的制作的制作核心则是.podspec 的制作 。cocoapods私有仓库是负责管理这些.podspec 的仓库

下面以TestDemo2为例,记录依赖库的制作。

1.git仓库建立

cocoapods 是托管在github上的,这里我们使用国内的git仓库码云作为托管仓库平台


图例1.png

图中8个地方:
1.项目名称,也就是依赖库的名称,必填项
2.搜索路径,也就是cocoapods搜索依赖库的地址
3.项目介绍
4.项目开发语言,cocoapod对针对依赖库做检测,这个作为依据
5.git 忽略文件
6.开源许可证 ,这里使用MIT,为啥要选不懂,欢迎科普
7.依赖库类型,是否公开,我们选择不公开,github私有仓库是收费的,这里就是为啥选择码云作为仓库。
8.Readme,项目说明文档,建议勾选创建。

图例2.png

2.clone到本地

clone仓库到本地,完成项目文件的添加

git clone https://git.oschina.net/ZOKAI/TestDemo2.git

如下,表明仓库已完成clone

Cloning into 'TestDemo2'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.

本地目录


图例3.png

添加过项目文件的本地目录

git add -A && git commit -m 'add project file'
git push origin master
图例4.png

3 .podspec 文件

依赖库的核心就是.podspec 文件的创建
有两种方式创建podspec文件:
1.从其他地方复制过来,然后修改
2.使用命令行
我们这里使用命令行创建

 pod spec create TestDemo2

里面有很多的内容,但是大多数都是我们不需要的,所以我们只需要根据项目的情况保留关键的内容
podspec 文件配置



Pod::Spec.new do |s|


  s.name         = "TestDemo2" #specc文件的名称
  s.version      = "1.0.0" #对应的版本
  s.summary      = "简短介绍 TestDemo2." #简短介绍
  s.description  = <<-DESC 
  测试用例,这里是详细介绍,可以不写,但是
                   DESC

  s.homepage     = "https://git.oschina.net/ZOKAI/TestDemo2.git" #注意
  # s.screenshots  = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"

  s.license      = "MIT" #开源协议
  # s.license      = { :type => "MIT", :file => "FILE_LICENSE" }

  s.author             = { "ZOKAI" => "1558390418@qq.com" } #作者,邮箱
  # Or just: s.author    = "ZOKAI"
  # s.authors            = { "ZOKAI" => "1558390418@qq.com" }
  # s.social_media_url   = "http://twitter.com/ZOKAI"

  # s.platform     = :ios
  s.platform     = :ios, "8.0" #平台,版本

  #  When using multiple platforms
  # s.ios.deployment_target = "5.0"
  # s.osx.deployment_target = "10.7"
  # s.watchos.deployment_target = "2.0"
  # s.tvos.deployment_target = "9.0"

  s.source       = { :git => "https://git.oschina.net/ZOKAI/TestDemo2.git", :tag => "#{s.version}" }#对应的资源文件的地址,注意后边的tag ,其实就是他的版本,pods是以git为基础管理的。
## 这里不支持ssh的地址,只支持HTTP和HTTPS,最好使用HTTPS
## 正常情况下我们会使用稳定的tag版本来访问,如果是在开发测试的时候,不需要发布release版本,直接指向git地址使用
  s.source_files  = "TestDemo2/TestDemo2/Class/**/*.{h,m}" #编译源文件
  s.exclude_files = "Classes/Exclude" #排除文件

  s.requires_arc = true #是否是arc模式 
  s.frameworks = "UIKit", "Foundation"#使用的framworks 这里可以是系统的framework 也可以是部分第三方中包含的frameworks ,多个以","隔开

  s.dependency "SVProgressHUD", "~> 2.1.2"#使用了cocopoads第三方依赖库 ,多个以","隔开
  s.module_name = 'TestDemo2' #模块名称


  # s.public_header_files = "Classes/**/*.h" #公开的头文件

  # s.resource  = "icon.png"
  # s.resources = "Resources/*.png"

  # s.preserve_paths = "FilesToSave", "MoreFilesToSave"

  # s.framework  = "SomeFramework"

  # s.library   = "iconv"
  # s.libraries = "iconv", "xml2"


  # s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }

end

s.module_name = 'TestDemo2' #模块名称 这个需要特别留意,这个是最终使用pod 'xxx' 的名称

图例5是依赖库工程的组织目录


图例5.png

图例6是最终制作完毕的私有仓库在使用的时候的组织目录,对比可见目录结构已经打乱


图例6.png

图例7 是AFNetworking在使用的时候的组织目录,对比发现仍然保持有目录结构
图例7.png

如果需要保持组织结构 ,如AFNetworking 的组织目录 则需要在.podspec 配置。参考AFNetworking.podspec

Pod::Spec.new do |s|
 s.name     = 'AFNetworking'#sepc文件的名字
 s.version  = '2.5.4'#对应的版本
 s.license  = 'MIT'#开源协议
 s.summary  = 'A delightful iOS and OS X networking framework.'#简单的介绍
 s.homepage = 'https://github.com/AFNetworking/AFNetworking'#主页
 s.social_media_url = 'https://twitter.com/AFNetworking'#作者的twitter 
 s.authors  = { 'Mattt Thompson' => 'm@mattt.me' }#作者 和他的邮箱
 s.source   = { :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => s.version, :submodules => true }#对应的资源文件的地址,注意后边的tag ,其实就是他的版本,pods是以git为基础管理的。版本就是tag值了
 s.requires_arc = true#是否是arc模式 

 s.ios.deployment_target = '6.0'#iOS对应的版本
 s.osx.deployment_target = '10.8'#OX S 对应的版本

 s.public_header_files = 'AFNetworking/*.h'#公共的头文件地址
 s.source_files = 'AFNetworking/AFNetworking.h'#文件地址,pod会以这个地址下载需要的文件构建pods

 s.subspec 'Serialization' do |ss|#对应的一些子工程
   ss.source_files = 'AFNetworking/AFURL{Request,Response}Serialization.{h,m}'
   ss.ios.frameworks = 'MobileCoreServices', 'CoreGraphics'
   ss.osx.frameworks = 'CoreServices'
 end

 s.subspec 'Security' do |ss|
   ss.source_files = 'AFNetworking/AFSecurityPolicy.{h,m}'
   ss.frameworks = 'Security'
 end

 s.subspec 'Reachability' do |ss|
   ss.source_files = 'AFNetworking/AFNetworkReachabilityManager.{h,m}'
   ss.frameworks = 'SystemConfiguration'
 end

 s.subspec 'NSURLConnection' do |ss|
   ss.dependency 'AFNetworking/Serialization'
   ss.dependency 'AFNetworking/Reachability'
   ss.dependency 'AFNetworking/Security'

   ss.source_files = 'AFNetworking/AFURLConnectionOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperation.{h,m}', 'AFNetworking/AFHTTPRequestOperationManager.{h,m}'
 end

 s.subspec 'NSURLSession' do |ss|
   ss.dependency 'AFNetworking/Serialization'
   ss.dependency 'AFNetworking/Reachability'
   ss.dependency 'AFNetworking/Security'

   ss.source_files = 'AFNetworking/AFURLSessionManager.{h,m}', 'AFNetworking/AFHTTPSessionManager.{h,m}'
 end

 s.subspec 'UIKit' do |ss|
   ss.ios.deployment_target = '6.0'

   ss.dependency 'AFNetworking/NSURLConnection'
   ss.dependency 'AFNetworking/NSURLSession'

   ss.ios.public_header_files = 'UIKit+AFNetworking/*.h'
   ss.ios.source_files = 'UIKit+AFNetworking'
   ss.osx.source_files = ''
 end
end

AFNetworking是通过subspec 来保持子目录结构的,如果有需求的可以在这里特殊配置。

4.检测podspec文件

podspec文件默认有error 和warning 都不会检测通过 --allow-warnings 参数会运行warnings 可以加上 --verbose 参数查看debug信息

pod lib lint --allow-warnings

检测成功,即表明依赖库制作完毕

 -> TestDemo2 (1.0.0)
TestDemo2 passed validation.

这里介绍一个情况
如图例8 ,使用RongCloudIM的时候发现,里面有.a 静态库和.framework

图例8.png

依旧使用

pod lib lint TestDemo2.podspec --allow-warnings --verbose

检测,会出现如下错误

- ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include static binaries: 
(/private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/RongIMKit.framework, 
/private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/libopencore-amrnb.a,
 and /private/var/folders/2c/78rv4swj57n7pvzdy7jk3w0w0000gn/T/CocoaPods/Lint/Pods/RongCloudIM/RongCloudIM/RongIMLib.framework)

原因就是依赖库(s.dependency)包含了.a静态库造成的,解决方法是,添加 --use-libraries 来让检测通过

pod lib lint TestDemo2.podspec --allow-warnings --verbose --use-libraries

这样在以后使用私有仓库的时候。podfile 需要做如下修改

pre_install do |installer|
def installer.verify_no_static_framework_transitive_dependencies; end
end

下一篇
制作cocoapods私有仓库(二)cococapods私有仓库制作

参考:
折腾cocoaPods, 创建自己的依赖库
'The 'Pods' target has transitive dependencies that include static binaries' when installing 'xxxx'

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

推荐阅读更多精彩内容