美文网首页iOS日常iOS开发iOS
iOS开发:项目管理之利用cocopods以及svn创建本地私有

iOS开发:项目管理之利用cocopods以及svn创建本地私有

作者: 哇哦萌芽技术团队 | 来源:发表于2016-11-18 18:19 被阅读592次

前言:在企业开发中,我们可能不止需要开发一个项目,并且,在一个项目中,我们可能会积累很多自己封装的公用类库,有的人会通过github或者OSChina等远程服务器保管自己制作的私有pod,但是有些企业出于安全考虑只允许在内网保存项目资料,这时就需要在本地创建自己的私有仓库了。一般情况下,可以搭建本地git服务器,并将私有pod托管到本地git服务器上,这里讲讲另一套思路,利用svn管理私有pod,这里用到的svn管理软件是cornerStone.
注:虽然svn有权限验证,但是制作私有pod的时候可以绕过这套验证,不用进行用户名密码的鉴权。

well, talk is cheap,show you my code.

首先,你应该在svn上传自己的公共库(这里就不赘述了,不在本篇讨论范围内)
这里是我创建的测试库 ↓↓↓↓


图片.png

其中的YDKit就是我在项目中抽取的三个公共类目,分类、组件、以及服务(支付、分享、地图、热修复等)

图片.png

这里的公共类库大家可以自己创建自己的文件即可。

其次,我们需要创建一个podSpec文件,podSpec中spec的全称是“Specification”,意思说明书。顾名思义,这是用来描述你这个私有pod的说明信息的。
podSpec是cocoapods的一种文件格式,有一套自己的语法,我们可以到cocoapods官网进行详细了解,参考链接(https://guides.cocoapods.org/syntax/podspec.html);
初学者如果觉得看语法比较乏味的话,我建议可以去github上查看其它知名第三方库的podSpec文件的写法,就可以慢慢弄懂详细的规则了。
这里介绍一下我参考的两个podSpec文件:
xmppframework:https://github.com/processone/XMPPFramework/blob/master/XMPPFramework.podspec
ShareSDK:https://github.com/MobClub/ShareSDK3.x-for-iOS/blob/master/ShareSDK3.podspec

创建podSpec很简单,只要创建一个以.podSpec为后缀的文件即可,或者直接拷贝别人的进行修改也可以。

这里我先把我的podSpec部分内容展示出来,并解释其中语法的语义:

图片.png
整个私有pod制作的核心就在这里了,就是podSpec文件的编写。

1、这里的,s/ss/sss是这个库的一个代码上的别名,就好比如let jack = "jackJones"一样
2、 s.source = { :svn => "svn://xxxx/YDKit/", :tag => "#{s.version}" }

这里我的svn路径是svn://,有些人是http://注意使用自己的scheme。
这里的source是用来告诉计算机,我这个库,在svn的这个路径上,找文件就到这里找。

3、假如你的第三方库只有一个文件夹,比如你有一个公共库叫components ↓↓

图片.png
里面都是一些文件比如.h/.m/.a/.framework/.bundle文件等,这时候你就不用创建ss/sss这些子仓库了.你只要写一句 s.source_files = "components/*/.{h,m}",pod就算制作完成了。
但是如果你的库有二级、三级、四级...目录的话,这时就需要通过.subspec
来创建子库以及子目录(如果没有的话,则pod install后所有的文件都放在一级目录下,不会有其他文件目录)。这里的.subspec有两个作用,一个是创建目录,另一个是可以不用引用整个私用库,只引用一个总库当中的某个分库,比如说你想直接引用YDKit中的components,不需要引用YDKit中的其他库(categories和services),这点后面再讲。

备注:这里关于创建库的描述,其实是在描述你pod Install之后在pod文件夹下,文件的目录结构、导入svn中的哪些文件等信息的。


Paste_Image.png

创建一个总库的基本语法是:
Pod::Spec.new do |s|
xxx
end

创建一个子库的基本语法是:
s.subspec 'Components' do |ss|
ss.source_files = 'YDKit/Components/*/.{h,m}'
end

可以创建子库-->s.subspec,子库的字库-->ss.subspec,即嵌套创建。

s.subspec 'Components' do |ss|

ss.subspec 'Components' do |sss|

end

end

然后我来解释一下其中一些语法的作用:

.dependency :需要依赖的第三方库,设置之后会自动通过pod下载第三方库

.frameworks :需要导入的系统framework(抱歉上图标注的箭头方向错了,箭头应该指到sss.framework),这里只要写库的名称就好了,后面就不要加'.framework'了

.libraries需要导入的系统lib、.a等,比如libc++.tbd,libz.tbd,注意这里不需要写lib,也不需要写.tbd,在podSpec中只要写c++,z就可以了,否则的话会报错。

.vendored_frameworks:需要引入的自己拖到库中的framework,会将自己拖到私有库中的framework文件整体搬到pod文件夹下,不写的话,framework是不会引用到pod文件夹中的哦,下面的.vendored_libraries也是。

.vendored_libraries:需要引入的自己拖到库中的libraries,会将自己拖到私有库中的.a文件拷贝到pod文件夹下

.resources 需要引入的.bundle等资源文件。

到了这里,一些基本的语法都已经讲完了。

备注:
编辑podSpec文件时最好在xcode或者终端中编写,如果是在文本编辑中编写的话里面的单引号字符容易自动转成中文字符,需要手动更正这些中文字符的单引号,否则cocoapods将无法识别该podSpec文件,导致安装失败。
在podSpec文件编写完成后,记得将最新的修改commit上去,因为我们在项目中执行pod install操作的时候,是直接到svn服务器寻找服务器上的podSpec文件,然后根据podSpec文件中描述的subSpec、dependency等信息,将podSpec文件中.source指明的路径下的文件下载到项目中pod工程内部的pod文件夹下。

最后编写完成后,就是开始引用啦!

直接在podfile里面,使用
pod 'YDKit', :svn =>"svn://192.168.111.222/ios/common/YDKit/"
即可直接从服务器获取所有私有pod以及相关的依赖库了。

需要注意的是,凡是通过.subspec创建的子库,都可以被直接安装引用,
比如说 如果仅仅想引用YDKit内部的某个目录的文件的话,则可在pod后面指明具体的路径即刻,比如说只想引用Service目录时,可使用这个语句:
pod 'YDKit/Services',:svn =>"svn://192.168.111.222/ios/common/YDKit/"
引用services内部的PayManager:
pod 'YDKit/Services/PayManager/',:svn =>"svn://192.168.111.222/ios/common/YDKit/"

参考链接:
podSpec文件配置:http://blog.csdn.net/xiaofei125145/article/details/50673392
http://blog.csdn.net/u010990519/article/details/55803927
well,that'it! try it now!

相关文章

网友评论

  • CoderChan:s.subspec 中我又 引用另一个 s.subspec 需要配置什么么, 我这里 不成功. 如下:

    s.source = { :svn => "svn://192.168.3.105:9001/svn/mobile/iOS_Components" }
    # swift 网络请求 模块
    s.subspec 'Network-Swift' do |network|
    network.source_files = 'Components/CommonModule/Network-Swift/Network/**/*'
    network.dependency 'iOS_Components/Extension' (不行)
    network.dependency 'Extension' (不行)
    network.dependency 'Alamofire', '~>4.2.0'
    end
    # swift Extension 模块
    s.subspec 'Extension' do |extension|
    extension.source_files = 'Components/CommonModule/Extension/Extensions/**/*'
    end
  • 遛狗的猫:你的私有库包含ShareSDK(里面QQ的Api不支持i386)是如何通过pod repo lib lint --use-libraries校验的呢?我最近在头疼这个问题,我的pod版本是1.2.0
    哇哦萌芽技术团队:@遛狗的猫 我没有用pod lib lint去验证podSpec。直接手动创建podSpec提交至svn,pod installl成功就可以了。如果不是提交到远程服务器,这部其实可以略掉,不过要比较注意书写的格式就是了。

本文标题:iOS开发:项目管理之利用cocopods以及svn创建本地私有

本文链接:https://www.haomeiwen.com/subject/bwcspttx.html