如何创建github私有仓库多少钱 CocoaPods 仓库

1. 创建主工程&
路径:/Users/Funky/Desktop/CocoaPodRemoteLib/MyMainProject/MyMainProject.xcodeproj
2. 在码云(http://git.oschina.net/)上创建一个自己的远程私有索引库,用来存放私有框架的详细描述信息.podspec文件&
3. 创建本地的私有索引库文件夹,并与远程私有索引库进行关联
3.1 $ pod repo(查看本地已存在的索引库)
- Type: git (master)
- URL:& /CocoaPods/Specs.git
- Path: /Users/Funky/.cocoapods/repos/master
3.2 添加本地私有索引库并与远程私有库
$ pod repo add MyProjectSpec https://git.oschina.net/funky_hs/myprojectspec.git
3.3 再次查看本地已存在的索引库 $ pod repo
4 在代码托管平台码云(http://git.oschina.net/)创建一个用来存放项目基础组件的仓库MyProjectBase&
5 快速创建模板测试工程(测试基础组件)
5.1 快速创建模板测试工程 在/Users/Funky/Desktop/CocoaPodRemoteLib路径下
cd /Users/Funky/Desktop/CocoaPodRemoteLib
$ pod lib create MyProjectBase (快速创建)&
5.2 填写以上信息后Xcode会自动打开测试工程,在测试模板工程文件夹下,我们可以看到如下:
5.3 用Category去替换Replace.m文件,在回到Example路径下,重新执行pod install操作
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyProjectBase/Example&
$ pod install
此时打开模板测试工程,我们可以看到Pods & Development Pods & MyProjectBase & MyProjectBase & Classes & Category & (.h .m)
我们可以在模板测试工程中进行修改和操作!
6 将上面的模板测试工程,提交到第四步创建的远程代码仓库
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyProjectBase&
$ git status
$ git add .
$ git commit -m'基础组件测试工程'
编辑MyProjectBase 模版工程的MyProjectBase.podspec文件&
$ pod lib lint (验证上一步编辑的 MyProjectBase.podspec文件)
如果有ERROR,则需要去一个个修改完成,例如某个Category的.m文件没有正确的引入依赖库等都会造成ERROR,解决好所有的ERROR后,验证结果如下:
这是一个警告,目前也并没有找到合适的解决办法,我们添加 --allow-warnings进行忽略
$ pod lib lint --allow-warnings
此时 MyProjectBase passed validation. 则说明验证通过
$ git status
$ git add .
$ git commit -m '编辑spec文件'
$ git remote add origin
(将本地库与远程代码仓库进行关联)
$ git push origin master& (提交到远程仓库)
$ git tag '0.1.0' (要与MyProjectBase.podspec文件中的tag值保持一致)
$ git push --tags(将tag提交到远程)
$ pod spec lint --allow-warnings(验证远程是否正确,注意:Username与Password一定要填写正确)
如果 Username与Password 填写不正确,则:
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /usr/bin/git clone http://git.oschina.net/funky_hs/myprojectbase.git /var/folders/d_/1bsk9q6n63zgbj5cwjg4m_wr0000gn/T/d1-13rl3wf --template= --single-branch --depth 1 --branch 0.1.0
MyProjectBase.podspec passed validation.
表明验证通过
7 将podspec文件提交到本地的私有索引库
$ pod repo
$ pod repo push MyProjectSpec MyProjectBase.podspec
表示提交成功,此时远程私有库到此就已结束
注意:提交后,依然会验证 podspec文件,验证通过后 会自动上传到在远程spec索引库,不信的话你可以看看在第二步创建的Spec远程私有索引库,是不是多了一个文件!
8 主工程利用Pods使用我们自己的私有框架
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyMainProject
$ pod init
用Xcode打开编辑Podfile文件&
$ pod install
打开MyMainProject.xcworkspace,此时在pod中可以找到远程私有库的代码
9 添加及修改基础组件内容
在本地的基础组件的Classes路径下 又新增了两个文件夹(Base,Tool)
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyProjectBase&
编辑MyProjectBase 模版工程的MyProjectBase.podspec文件&
$ git status
$ git add .
$ git commit -m'新增Base,Tool文件内容'
$ git push origin master (提交到远程)
$ git tag '0.2.0'
$ git push --tags
$ pod repo push MyProjectSpec MyProjectBase.podspec
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyMainProject
修改Podfile文件&
$ pod install
10 在基础组件MyProjectBase内部生成子库
问题描述:当我们执行完第九步后,我们发现主工程的Pods中并没有按文件夹(Base,Category,Tool)进行不同类的划分,同时当我们仅仅想引入一个Category库时,连同Base,Tool也引入进项目中,这就太恶心了!
参照AFNetworking&
修改MyProjectBase.podspec文件&
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyProjectBase
$ git status
$ git add .
$ git commit -m'生成子库文件夹'
$ git push origin master (提交到远程)
$ git tag '0.2.0'
$ git push --tags
$ pod repo push MyProjectSpec MyProjectBase.podspec
$ cd /Users/Funky/Desktop/CocoaPodRemoteLib/MyMainProject
修改Podfile文件&
$ pod install
就现在 快打开主工程看一看吧!
有不理解或者发现博主存在理解操作不正确的地方,欢迎评论,我会及时修正!
阅读(...) 评论()Cocoapods私有仓库封装过程中的思考
招聘信息:
背景:随着公司相关APP项目的开展,公用框架的创建与维护越发显得迫切起来。因为工作中经常接触使用cocoapods,也知道她其实可以搞定这件事,所以就首当其冲的选择了基于cocoapods的封装方案。Why给工作中封装的组件一个沉淀的地方。为新项目的开展提供高效的支撑。框架代码单独维护,功能点升级更新快捷。一定程度督促自己代码的组织与优化。知识储备搭建的过程大致参考了这篇教程:。教程非常的细致,很赞的分享。其中有几个地方可能会有点疑惑:Podfile中specs引入方式1.:path=>的引入方式会添加到DevelopmentPods中,并且复制整个私有库的文件组织结构(文件夹嵌套关系都会保留),这种引入方式非常适合于私有库的开发阶段,因为这种方式引入的其实就是实际私有库的源文件,在demo项目中通过这种方式引入,充分测试私有库的相关功能会非常方便快捷。对强迫症患者来说可能会觉得有点不完美的地方,就是当specs中包含subspecs的时候,用这种方式引入时,会出现一些多余的文件层次嵌套。。。感兴趣的患者们可以去试一下。。。2.常规的引入方式常规的引入方式这里就不多说了,它走的是另一个极端,会剔除库中的文件组织结构,而简单的划分了源文件与资源文件,如果包含subspecs,只保留子模块名一级的文件层次,模块内部的文件结构将不复存在,这里暂时没有找到合适的解决办法保留原有组织结构。比如上图的结构,发布之后将改变为:子模块划分思路先说结果,大致是按照这个思路进行划分的:1. 网络(剔除具体API调用部分)添加样例包含常用插件(network状态标识等)缓存2. 模型映射统一API调用规则封装公共响应处理逻辑对于错误类型的统一处理3. Hybrid资源的预加载(js, css等)native能力开放4. UIHUDTab侧边栏Nav常用操作下拉上拉Autolayout封装datasource封装常用动画转场5. 安全加密解密6. 统计swizzling添加打点入口日志记录模块封装bug收集分析7. 动态性热部署方案主要基于目前涉及项目主要关注的部分进行了一些拆解,每个模块直接可能存在依赖关系,这块cocoapods也贴心的帮忙搞定了,例如:s.subspec&'APIModule'&do&|ss|
&&&&ss.source_files&=&'Classes/APIModule/**/*.{swift,h,m}'
&&&&ss.dependency&'Moya',&'~>&6.5.0'
&&&&ss.dependency&'HanekeSwift',&'~>&0.10.1'
&&&&ss.dependency&'NetworkActivityIndicator',&'~>&0.1.6'
&&&&ss.dependency&'MonkeyKit/UtilModule'
&&&&ss.dependency&'MonkeyKit/ModelMapperModule'
&&&&ss.dependency&'MonkeyKit/SecurityModule'end框架会根据将来的实际使用情况再进行优化调整,逐渐完善起来。下一步本轮主要是基于基础功能模块的拆分封装,其实对于APP群常用的业务模块也可以做相同的工作,比如登录验证模块或者逻辑的封装等。通过对于公用业务场景的思考,逐渐提炼出可以产品化的地方,然后塞入公用库,将大大提升相关APP群的开发效率与产品质量。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6265点击量4590点击量4565点击量3500点击量2909点击量2409点击量2381点击量2351点击量2333
&2016 Chukong Technologies,Inc.
京公网安备89使用CocoaPods建立私有仓库 - 简书
使用CocoaPods建立私有仓库
大致分为以下几步:
1.本地建立一个索引库Spec Repo,映射到远程仓库(将来使用该仓库里面的.podspec文件定位到相应的代码)
2.创建pod工程(实现具体的组件代码)
3.生成spec文件
4.向本地的Spec Repo提交spec文件
5.pod新的文件
(一).本地创建索引库
官方的pod其实就是一个仓库里面放了很多开源的Spec Repo(关于如何创建cocoapods这里就不做说明了)假设你已经安装好了cocoapods
当cd 到~/.cocoapods/repos可发现如下截图那个master中就是官方的Spec Repo所在
C127BB3E-7C72-480C-9E5F-59DCE4CAF72B.png
看到这个目录之后我们要做的第一步就是在repos目录下建立属于自己的私有Spec Repo用来管理我们的代码,开始接下来的操作
1.在终端运行
pod repo add [本地repos的名称] [远程仓库的地址,这里可以用开源中国的,公司自己的代码管理平台地址等等,用来管理自己的私有源的地址]
pod repo add DemoSpec
https://XXX.git
运行完上面的代码重新cd 到~/.cocoapods/repos可以发现刚刚建立的文件以及可以看到了
(二).创建pod工程
这里没什么好说的,就是自己本地找个目录创建一个新的工程,可以使用pod的,有旧的项目的话更简单了(这里不做过多的讲解)
(三).生成spec文件
自己建一个pod工程(具体不做详解了,不知道的自行百度)这里只讲如何创建spec文件
pod spec create [项目sepc的名字] [代码的远程仓库的地址和第一步的地址最后不要一样]
pod spec create PodTestSpec https://xxx.git
成功以后会看到
Pod::Spec.new do |s|
= "PodTestSepec" #podsepc名称
= "1.0.0"#版本号
= "year descr."#框架的妙手
s.homepage
= ""#写你主页的地址
这里是我随意写的
= { "fangshufeng" =& "" }
s.platform
= :ios, "7.0"
= { :git =& "地址二", :tag =& "1.0.0" }#地址二写的就是步骤3写的地址 tag是版本号
s.source_files
= "podTest/**/*.{h,m}"#文件的目录
s.resource
= "podTest/podTest.bundle"#文件的资源 包括图片什么的
s.requires_arc = true
这里列举的是一些常用的
1.先编辑你的spec的文件写成你自己的项目相关的
2.然后再git上打上tag注意这里要和你spec里面写的一样(sourcetree什么都可以)
3.在当前工程的目录下输入下面的命令验证sepc文件
pod lib lint
四.向本地的Spec Repo提交spec文件
pod repo push DemoSpec PodTestSpec.podspec
#前面是本地Repo名字 后面是podspec名字
一般如果使用subspec文件的话,可能会依赖其他的三方库,有时候第三方库有警告可能会导致验证不过,可以使用下面的命令来屏蔽
pod repo push DemoSpec PodTestSpec.podspec --use-libraries --allow-warnings --sources='/CocoaPods/Specs'
如果下面的错误
The repo `YourSpecs` at `../../../.cocoapods/repos/YourSpecs ` is not clean 错误
可以按照下面的步骤解决
cd ~/.cocoapods/repos/YourSpecs
使用git clean -f
有时候私有源要指定地址,可以使用sources跟上源的地址,有多个源的话以逗号隔开
完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/DemoSpec目录下查看
├── LICENSE
├── DemoSpex
└── 1.0.0
└── PodTestSepc.podspec
└── README.md
再search命令查看你是否制作成功了(需要花点时间,耐心等候)
$ pod search PodTestSpec
-& PodTestSpec (0.1.0)
year descr.
pod 'PodTestSpec', '~& 1.0.0'
- Homepage:
- Versions: 1.0.0 [DemoSpec repo]
到此我们的私有pod以及制作好了
(五).pod的使用
另外新建一个工程
在podfile中加入
source "地址一"//就是第一步写的源地址
platform :ios, '7.0'
target 'hh' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
pod 'PodTestSpec', '~& 1.0.0'
关于pod的一些常见的操作请看如何创建私有 CocoaPods 仓库 - CSDN博客
如何创建私有 CocoaPods 仓库
如何创建私有 CocoaPods 仓库
字数2829&阅读2327&&喜欢9
公共 CocoaPods
打开隐藏目录,可以使用命令:&
defaults write com.apple.finder AppleShowAllFiles -bool true
defaults write com.apple.finder AppleShowAllFiles -bool false
接着需要重启一下&Finder, 可以按住&option&+ 右键&Finder&图标选择重启。然后打开隐藏目录&.cocoapods&(这个目录在你的个人目录底下,&~/.cocoapods&或&/Users/[username]/.cocoapods)
可以看到上图,&.cocoapods&目录下的&repos&其实是&repository&(仓库)的缩写。&repos&中存放的时仓库的集合。这里的&master&就是&CocoaPods&官方建立的仓库,也就是我们所谓的公共库。
specs&目录下存放的就是所有提交到&CocoaPods&的开源库的&podspec&文件的集合。
其结构如下图所示:
其组成方式:
specName -- version -- specName.podspec
(&master&里现在是&specName.podspec.json,这个&.json&文件就是&podspec&文件加了个后缀。我们可以采用&pod
ipc spec&这个命令来将&spec&文件转换成&.json)
那这个文件夹是如何来得呢?其实,这个文件夹是在你安装了&CocoaPods&后,第一次执行&pod
install&时,&CocoaPods&通过命令&pod setup&来建立的(这条命令会自动执行)。
上述是官方的&repo&,私有库的话可以看下我们前面的翻译或者查看,但是官方文档有一些过程写的不是特别详细,自己实现的时候遇到了一些坑,特此梳理一下过程,按照官方文档内容实现一个私有的&spec
repo&。根据官方的原理,我们只需要创建一个和&master&相类似结构的目录就可以实现私有的&spec repo,当然你可以&fork&一个官方的&repo,但是它包含了太多没有必要地库在里面,这在编译仓库的时候需要浪费大量的时间,所以我们只要自己重新创建一个就可以了。
1.创建一个私有的&Spec Repo
在你的 git 服务器上创建一个&repo。这里你可以在&github&或者你自己的 git 服务器上实现。公司内部使用的话这里推荐大家使用私有的仓库,但是&github&的私有仓库是要收费的&$7/month&(壕请无视 - -!)。大部分公司都是有自己的git服务器,不过一般只能在公司内网使用,或者可以选择,,&任意一种。我们以在&github&上创建为例:
如图所示,我们在&github&上创建一个空的仓库,命名为&O2Specs&,这个仓库是用来存放我们自己所有的私有库的&spec&文件,就如同官方的&&是用来存放所有官方的&specs&文件一样。
然后我们就可以执行:
pod repo add REPO_NAME SOURCE_URL
其中的 REPO_NAME 是我们要添加的私有&repo&的名称(这里我们待会填的是:&O2Specs),后面是仓库的 git 地址。这里做的其实是创建的工作,也就是在&~/.cocoapods/repo&目录下添加了一个以你的私有&repo&为名的文件夹,但是并没有添加&spec&文件。
在终端执行命令:
pod repo add O2Specs /marklin2012/O2Specs.git
这里用的是&https&地址,当然你也可以用&git&地址,不过这样有可能失败。如果失败,很大因素是你&github&的&ssh&在本地没有配置好,配置方法可以看这里:,成功后可以看得到&.cocoapods&目录如下图所示:
至此,我们已经在本地得到我们自己的私有仓库&O2Specs&,这是一个空的仓库。
2.添加私有的&Repo&安装到你的&CocoaPods&中
这个步骤需要我们事先完成&CocoaPods&依赖库的搭建,具体可以查看我们另外一篇教程:。如果这里你想先看看效果,也可以直接从&github&上
clone&继续下面的操作。
让我们进入到上面 clone 的示例工程目录中(或者你自己搭建的依赖库目录中):
打开工程的&podspec&文件:
Pod::Spec.new do |s|
= &O2View&
= &Just testing&
s.description
私有Pods测试
* Markdown 格式
s.homepage
= &http://aotu.io/&
#需要可访问的地址 否则无法通过
= { &linyi31& =& && }
= { :git =& &/marklin2012/O2View.git& }
s.platform
= :ios, &9.0&
s.requires_arc = true
s.source_files
= &O2View/*.swift&
s.frameworks = 'UIKit', 'QuartzCore', 'Foundation'
s.module_name = 'O2View'
这个文件本质上是一个&ruby&文件,这是我们事先已经实现好的依赖库的&podspec&文件,如果前面步骤都正常的话,也就是说我们认为这个&podspec&是合法的话,就可以直接将这些内容&push&到我们本地的&repo&中。为了避免错误,我们可以再验证一下,命令行输入:
pod lib lint
运行之后可能会得到下面的警告:
-& O2View (0.0.1)
| source: Git sources should specify a tag.
[!] O2View did not pass validation, due to 1 warning (but you can use `--allow-warnings` to ignore it) and All results apply only to public specs, but you can use `--private` to ignore them if linting the specification for a private pod..
You can use the `--no-clean` option to inspect any issue.
由于我们的示例工程还没有生成正式的&release&版本,&github&上并没有任何&tag,所以我们刚才填写&.podspec&文件填写&git&地址的时候没有填写指定&tag&(上面文件的注释中有提到),解决方法我们可以先执行忽略警告的命令:
pod lib lint --allow-warnings
如果成功会出现如下输出:
-& O2View (0.0.1)
| source: Git sources should specify a tag.
O2View passed validation.
到此,我们的&O2View.podspec&就符合规范了。
3.添加你的&Podspec&到你的&repo
在前面验证通过的基础上,我们接着执行命令:
pod repo push O2Specs O2View.podspec
执行完,如果失败会有相对应的警告和错误提示,只要按照警告和错误的详细信息进行修改和完善即可。成功的情况应该可以在终端看到类似的输出:
Validating spec
-& O2View (0.0.1)
| source: Git sources should specify a tag.
Updating the `O2Specs' repo
Already up-to-date.
Adding the spec to the `O2Specs' repo
- [Add] O2View (0.0.1)
Pushing the `O2Specs' repo
To https:///marklin2012/O2Specs.git
9f32092..8d0ced5
master -& master
再进入到&.cocoapods&的目录中,可以看到已经发生了变化:
同时,我们还发现&O2Specs&的&github&仓库也已经发生了变化:
按照平时使用&CocoaPods&的习惯,我们添加依赖库之前会先搜索一下库,让我们执行一下命令:
pod search O2View
哈哈,可以看到已经建立成功了!
-& O2View (0.0.1)
Just testing
pod 'O2View', '~& 0.0.1'
- Homepage: http:
- Versions: 0.0.1 [O2Specs repo]
4.测试私有 pod
看到前面的搜索结果,小伙伴们是不是开始有点激动了?让我们建立一个普通的工程,命名为&TestPodDemo,然后在终端&cd&到其目录路径下,添加一个&Podfile&文件:
建立后修改&Podfile&文件内容如下:
use_frameworks!
target 'TestPodDemo' do
pod ‘O2View’
pod install
我们得到如下提示:
Updating local specs repositories
Analyzing dependencies
[!] Unable to find a specification for `O2View`
[!] Your Podfile has had smart quotes sanitised. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
找不到&O2View&? 额- -!。。。刚才&search&明明可以找到这个依赖库的,为什么现在找不到了呢?
别着急!其实原因是你在&Podfile&中没有指定路径,当你执行&pod install&的时候,CocoaPods&默认只会在&master&下搜索,而我们的&spec&是存在我们私有的&O2Specs&目录下的。所以解决方式很简单,就是引入搜索地址即可,在&Podfile&的顶部添加如下两行代码:
source '/CocoaPods/Specs.git'
source ‘/marklin2012/O2Specs.git’
这里必须添加两个地址,默认情况下,你如果不添加&source&,系统会默认使用官方仓库地址,但是当你添加了&source&之后,系统就不会自动搜索官方地址,所以这两句都必须添加,否则其他基于官方的依赖库都不能使用了。
再次执行&pod install&,我们就可以看到很顺利的安装成功了:
Updating local specs repositories
Analyzing dependencies
Downloading dependencies
Using O2View (0.0.1)
Generating Pods project
Integrating client project
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
恭喜!这样一来我们就可以使用这个私有库了!&
发布稳定的依赖库版本
前面我们提到过,我们的这个实例依赖库&O2View&没有生成稳定的&release&版本。当我们调试完内容之后,一般都是要发布稳定版本的,更新之后再继续发布新版本。我们可以使用命令行或者在&github&页面手动生成,这里为了方便我们使用命令行,首先在终端中&cd&到之前的依赖库&O2View&的目录中,然后输入如下命令:
git tag '0.0.1'
git push --tags
git push origin master
这样我们就得到了一个稳定的&release&版本&0.0.1:
这里我用的版本号是&0.0.1&基于研发版本,关于版本号的一些规范可以参考:
对于我们的&podspec&文件,我们也需要将&s.source&做一下小小的改动:
= { :git =& &/marklin2012/O2View.git&, :tag =& version }
这样我们使用这个依赖库的时候就能对应上版本号,并且知道在&github&中使用稳定的&release&版本代码。太棒了!
最后只需要再重复&push&一下我们的&Podfile&就可以!
接下来做什么?
好了,到这里我们已经完全掌握如何创建一个本地私有的&CocoaPods&了!我们完全可以把我们项目中得代码拆出来好好的封装一些&pods, 好好使用这个黑魔法!
本文已收录于以下专栏:
相关文章推荐
CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便。
个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们...
记得一次面试有人问我有没有自己开源一些库,有是有的,但是确没有制作成可以通过pods导入的库,此乃一大憾事,后来跟着网上很多教程在那里捣鼓了半天,真的是半天时间,压根没用,今天无意间看到一篇博客,ht...
官方引导原文CocoaPods不仅是一个将开源代码添加到项目的很棒的工具,同时也可以做到跨项目分享组件。你使用一个私有的Spec Repo就能做到这些。只需要几个简单步骤就能给你的项目做好一个私有的p...
CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便。个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开...
CocoaPods发布框架到远程公有库
1.编写代码~上传远程仓库git init
git commit -m '提交到本地分支'//关联远程仓库
git remote add o...
CocoaPods应该是iOS最常用最有名的类库管理工具了,上述两个烦人的问题,通过cocoaPods,只需要一行命令就可以完全解决,当然前提是你必须正确设置它。重要的是,绝大部分有名的开源类库,都支...
众所周知,CocoPods是iOS一个非常好用的依赖管理工具,可以使用它很好的管理和更新第三方库,在公司的开发过程中,公司内部也尝尝有可以不同项目复用的功能模块,公司希望可以使用CocoPods 进行...
pod已经推送到了CocoaPods私有仓库,且本地手动添加的私有仓库已更新,但工程中使用的pod还是老版本。
检查会发现本地/.cocoapods/repos目录中会有多个私有仓库的文件夹。
创建code repositorypod lib create 项目名称
pod lib create RemoteNotificationManager
What language do y...
一、 首先简单了解下cocoapods的机制
cocoapods有个远程索引库,索引库下放着框架的描述信息:框架的名称,框架的版本号,框架的描述文件(.spec),开发者上传的代码都是位于索引库的远程...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)使用私有Cocoapods仓库 中高级用法 - 简书
使用私有Cocoapods仓库 中高级用法
上一篇文章《》讲解了创建私有pod的初步教程,接下来我们提升一下难度。
需求如下:
使用私有spec仓库
创建私有pods
私有pods依赖第三方静态库(.a , .framework)
私有pods依赖第三方pods
私有pods依赖另外的私有pods
依赖关系如下:
NCKUIKit(私有pod)
SDWebImage(依赖的第三方pod)
BaiduMap.framework(手动引入的第三方framework)
NCKFoundation(依赖的私有pod)
AFNetworking(依赖的第三方pod)
libWechat.a(手动引入的第三方framework)
Github上的仓库列表如下:
NCKFoundation
为了方便读者的调试,此次的仓库都是基于github的。
创建3个仓库
1.创建/使用已有NCKSpecs仓库
如果没有在github上新建一个仓库,如果有该仓库则直接在终端输入一下命令即可。
pod repo add NCKSpecs /NicolasKim/NCKSpecs.git
以上命令会把github上的NCKSpecs仓库克隆到本地。执行一下命令查看本地的pods仓库:
2.创建NCKFoundation仓库
在github创建NCKFoundation仓库
3.创建NCKUIKit仓库
在github创建NCKUIKit仓库
编写 NCKFoundation pods
1. 创建NCKFoundation pods以及DEMO工程
切换到需要的目录下执行一下命令:
pod lib create NCKFoundation
以上命令会在你指定的目录下,根据cocoapods的pods模板生成一个pods工程,包含pods以及demo工程,先不要着急打开工程。文件目录如下:
在终端进入到Example目录下
pod install
这时会看到Example目录下会生成一个workspace文件
双击打开工程,工程目录如下:
把replaceme删除掉,Classes下新建一个类NCKRootObject编辑NCKFoundation.podspec文件,里面有一堆东西,先全部删除掉,并粘贴如下代码:
Pod::Spec.new do |spec|
= 'NCKFoundation'
spec.version
spec.summary
= 'Guide for private pods :'
spec.description
Guide for private pods
spec.homepage
= '/NicolasKim/'
spec.license
= { :type =& 'MIT', :file =& 'LICENSE' }
spec.author
= { 'NicolasKim' =& '' }
spec.source
= { :git =& '/NicolasKim/NCKFoundation.git', :tag =& spec.version.to_s }
spec.ios.deployment_target = '8.0'
spec.source_files = 'NCKFoundation/Classes/*.{h,m}'
到podfile的目录下执行命令
pod install
他会根据spec文件,将NCKRootObject跟demo工程进行链接
先做一下参数说明:
spec可以看做是一个对象实例,有很多属性如下:
name:顾名思义就是pod的名字,当我们使用pod search xxxx时,xxx就是name。
version : pod 的版本 也就是我们再podfile里指定的那个版本。
summary:概要说明
description:pod的描述。
source:远程仓库的地址以及tag版本
ios.deployment_target:ios部署版本osx.deployment_target:osx部署版本
source_files: 需要编译文件的文件目录,注意是文件目录而不是工程目录
在上传到git仓库之前,做一下检查:在NCKViewcontroller中
#import "NCKRootObject.h"
不报错说明source_files指定的目录没有问题。
接下来用pod的命令检查一下。
后退到podspec文件存在的目录下,输入一下命令:
pod lib lint
如果因为有无关紧要的警告而未通过检查,则输入一下命令:
pod lib lint --allow-warnings
检查时pod会忽略警告。如果出现一下提示,你懂得,已经成功一大半了。
NCKFoundation passed validation.
接下来远程检查pods,这次cocoapods会根据podspec文件里的source 检查对应的仓库里有没有指定tag的仓库。显然我们还没有将NCKFoundation 上传到github的NCKFoundation仓库里,可定会报错,执行试一下。
pod spec lint
-& NCKFoundation (1.0)
| description: The description is shorter than the summary.
- ERROR | [iOS] unknown: Encountered an unknown error ([!] /Applications/Xcode.app/Contents/Developer/usr/bin/git clone /NicolasKim/NCKFoundation.git /var/folders/6x/8pyfnj_nyjz41c0000gn/T/d30-148x77b --template= --single-branch --depth 1 --branch 1.0
Cloning into '/var/folders/6x/8pyfnj_nyjz41c0000gn/T/d30-148x77b'...
fatal: Remote branch 1.0 not found in upstream origin
) during validation.
Analyzed 1 podspec.
[!] The spec did not pass validation, due to 1 error and 1 warning.
根据错误得出,对应的仓库里没有1.0的分支。
3.上传NCKFoundation
那我们就将工程上传的github上,并创建1.0的tag。上传方式自行解决,网上有很多可视化工具,比如sourcetree。
上传结束后再检查一下:
pod spec lint --allow-warnings
这次应该没有问题了吧?
好,还没完,接下来我们把podspec文件上传的我们自己的spec仓库里,而不是cocoapods的仓库。
pod repo push NCKSpecs NCKFoundation.podspec --allow-warnings
cocoapods会把podspec文件上传到NCKSpecs仓库中。好现在去你的github看看spec仓库。
4.使用私有pods
新建一个工程,TestNCKFoundationPod终端进入该目录,新建Podfile。在第一行加入如下代码:
source '/NicolasKim/NCKSpecs.git'
意思就是当搜索或者下载pods的时候默认从NCKSpecs.git中获得信息。也就是说,我们从Cocoapods的spec仓库移到我们自有的spec仓库。之后就是正常的pods使用方法。
target 'TestNCKFoundationPod' do
pod 'NCKFoundation', '~& 1.0'
pod install
试图引入NCKRootObject.h并运行测试工程。
5. 添加afnetworking 和 微信的依赖
先从微信开放平台下载微信sdk在NCKFoundation/NCKFoundation/Classes 目录下创建ThirdParty文件夹,并将.a和.h文件拖到ThirdParty文件夹下。(注意不要拖到工程目录下,而是文件目录)在podspec文件里修改source_file 为
spec.source_files = 'NCKFoundation/Classes/*.{h,m}', 'NCKFoundation/Classes/ThirdParty/*.{h}'
添加.a静态库的依赖,.a依赖的系统framework以及library
spec.vendored_libraries
= 'NCKFoundation/Classes/ThirdParty/*.{a}'
spec.frameworks = 'SystemConfiguration','CoreGraphics','CoreTelephony','Security','CoreLocation','JavaScriptCore'
spec.libraries
= 'iconv','sqlite3','stdc++','z'
vendored_libraries: 第三方.a文件
frameworks: 该pod依赖的系统framework
libraries: 该pod依赖的系统library
添加AFNetworking的依赖
spec.dependency
'AFNetworking', '~& 3.1.0'
dependency : 该pod依赖的pod
pod install
之后看一下工程目录
在Example里的NCKViewController里#import "WXApi.h"运行工程看看报不报错。
6.制作subspec
先说一下subspec是什么在终端搜索一下sdwebimage,结果如下
也就是说我们再使用sdwebimage时不用下载全部的组件,喜欢用哪个就下哪个,由此得出subspec可以生成一个子模块儿,当然这需要我们再编码的过程中减少模块儿之间的依赖,使各个模块儿可以独立运行。
好!接下来我们试着做一个子模块儿在工程目录下 新建文件夹NCKSub(并生成对应的文件目录) 新建一个类NCKChild,并在podspec文件里添加如下代码:
spec.subspec 'NCKSub' do |cs|
cs.source_files = 'NCKFoundation/Classes/NCKSub/*.{h,m}'
NCKSub : subspec的名字
可以随意起名
cs : 为变量名
与spec类似
拥有spec用的所有属性 可以随意起名
pod install
观察一下工程目录,并运行。还顺利吗?
接下来我们准备升级pods的版本
将podspec的version 改为2.0
pod lib lint --allow-warnings
将NCKFoudation push至远程仓库并新建2.0的tag将podspec push至私有的spec仓库中
pod repo push NCKSpecs NCKFoundation.podspec --allow-warnings
pod search NCKFoundation
结果如下:
我们去TestNCKFoundationPod 这个工程中修改一下Podfile为
source '/NicolasKim/NCKSpecs.git'
source '/CocoaPods/Specs.git'
target 'TestNCKFoundationPod' do
pod 'NCKFoundation', '~& 2.0'
因为在私有的pod中依赖了另外的pod(afnetworking)afnetworking的spec文件是在cocoapods的仓库里 所以要添加一个cocoapods的spec仓库地址。
pod install
看一下工程目录:
NCKFoundation pods制作完毕!
编写 NCKUIKit pods
新建NCKUIKit pods
步骤与NCKFoundation一样 进入指定目录直接在终端里输入
pod lib create NCKUIKit
到Example目录下pod install打开工程编辑podspec文件
Pod::Spec.new do |spec|
= 'NCKUIKit'
spec.version
spec.summary
= 'A short description of NCKUIKit.'
spec.description
Add long description of the pod here.
spec.homepage
= '/NicolasKim/NCKUIKit'
spec.license
= { :type =& 'MIT', :file =& 'LICENSE' }
spec.author
= { 'NicolasKim' =& '' }
spec.source
= { :git =& '/NicolasKim/NCKUIKit.git', :tag =& spec.version.to_s }
spec.ios.deployment_target = '8.0'
spec.source_files = 'NCKUIKit/Classes/*.{h,m}'
spec.dependency 'SDWebImage', '~& 3.8.2'
关联Baidumap.framework
去百度地图官网下载framework目录如下
将整个文件夹拖到Classes目录下
然后编辑podspec如下
Pod::Spec.new do |spec|
= 'NCKUIKit'
spec.version
spec.summary
= 'A short description of NCKUIKit.'
spec.description
Add long description of the pod here.
spec.homepage
= '/NicolasKim/NCKUIKit'
spec.license
= { :type =& 'MIT', :file =& 'LICENSE' }
spec.author
= { 'NicolasKim' =& '' }
spec.source
= { :git =& '/NicolasKim/NCKUIKit.git', :tag =& spec.version.to_s }
spec.ios.deployment_target = '8.0'
spec.source_files = 'NCKUIKit/Classes/*.{h,m,mm}'
spec.dependency 'SDWebImage', '~& 3.8.2'
spec.vendored_frameworks = ['NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Base.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Location.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Map.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Search.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Utils.framework']
spec.resource_bundles = {'Resources' =& 'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Map.framework/Resources/mapapi.bundle'}
spec.frameworks = 'CoreLocation','QuartzCore','OpenGLES','SystemConfiguration','CoreGraphics','Security','CoreTelephony'
spec.libraries = 'sqlite3.0', 'stdc++.6.0.9'
#spec.user_target_xcconfig =
{'OTHER_LDFLAGS' =& ['-lObjC','-all_load']}
参数说明:
vendored_frameworks:
第三方framework
pod_target_xcconfig:
build setting的配置
关联私有pod NCKFoundation
继续编辑podspec文件,如下:
Pod::Spec.new do |spec|
= 'NCKUIKit'
spec.version
spec.summary
= 'A short description of NCKUIKit.'
spec.description
Add long description of the pod here.
spec.homepage
= '/NicolasKim/NCKUIKit'
spec.license
= { :type =& 'MIT', :file =& 'LICENSE' }
spec.author
= { 'NicolasKim' =& '' }
spec.source
= { :git =& '/NicolasKim/NCKUIKit.git', :tag =& spec.version.to_s }
spec.ios.deployment_target = '8.0'
spec.source_files = 'NCKUIKit/Classes/*.{h,m,mm}'
spec.dependency 'SDWebImage', '~& 3.8.2'
spec.vendored_frameworks = ['NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Base.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Location.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Map.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Search.framework',
'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Utils.framework']
spec.resource_bundles = {'Resources' =& 'NCKUIKit/Classes/BaiduMap_IOSSDK_v3.0.0_Lib/BaiduMapAPI_Map.framework/Resources/mapapi.bundle'}
spec.frameworks = 'CoreLocation','QuartzCore','OpenGLES','SystemConfiguration','CoreGraphics','Security','CoreTelephony'
spec.libraries = 'sqlite3.0', 'stdc++.6.0.9'
#spec.user_target_xcconfig =
{'OTHER_LDFLAGS' =& ['-lObjC','-all_load']}
spec.dependency 'NCKFoundation'
podspec文件编辑完毕,先不要着急 pod install现在pod install 肯定找不到 NCKFoundation
所以我们需要在里Podfile一下 source编辑Podfile如下:
use_frameworks!
source '/NicolasKim/NCKSpecs.git'
source '/CocoaPods/Specs.git'
target 'NCKUIKit_Example' do
pod 'NCKUIKit', :path =& '../'
target 'NCKUIKit_Tests' do
inherit! :search_paths
pod 'FBSnapshotTestCase'
pod install
这是会从私有仓库 下载NCKFoundation 并配置到工程。
把NCKUIKit push到私有仓库里。(请自行解决)
接下来检查一下podspec文件
NCKUIKit的检查与NCKFoundation的检查稍微有点儿区别,因为NCKUIKit 依赖了NCKFoundation,同时NCKFoundation 是私有仓库里的pod ,所以我们检查是需要指定source。一个为cocoapods的source 另一个为私有spec仓库的source
pod lib lint --sources=/NicolasKim/NCKSpecs.git,/CocoaPods/Specs.git --allow-warnings
检查通过后直接把spec文件push到私有spec仓库里。
注意:push时默认会检查 spec文件 所以同样需要提供source
pod repo push NCKSpecs NCKUIKit.podspec --sources=/NicolasKim/NCKSpecs.git,/CocoaPods/Specs.git --allow-warnings
将 TestNCKFoundationPod 的podfile改成如下:
target 'TestNCKFoundationPod' do
pod 'NCKUIKit'
pod install
NCKFoundation pods制作完毕!
感谢您的耐心观看,如果您觉得这篇文章有帮助,请您高台贵指点一下喜欢就可以了。

我要回帖

更多关于 创建私有仓库 的文章

 

随机推荐