<tr id="2okqm"></tr>
<sup id="2okqm"><small id="2okqm"></small></sup>
<rt id="2okqm"><optgroup id="2okqm"></optgroup></rt><tr id="2okqm"><optgroup id="2okqm"></optgroup></tr><rt id="2okqm"><center id="2okqm"></center></rt>

使用Cocoapods创建私有Pod

96
Tony17
2018.04.29 16:52 字数 2725

前言

Cocoapods是非常好用的一款iOS第三方库管理工具,使用它可以非常方便的管理和更新项目中使用到的第三方库,我们也可以把项目中的公共组件交给它去管理。Cocoapods的介绍及优缺点本文就不再赘述。

Cocoapods在安装之后,会在本地保存一份所有可以通过Cocoapods安装的第三方库的索引(Spec Repo)。这份索引中的所有项目都是公开的项目。

需求

随着项目功能越来越复杂,项目中有许多功能或者组件可以封装成类似AFNetowrkSDWebImage这样的第三方库的?#38382;?#26469;提供给项目中的其他模块使用,但是由于可能涉及到公司内部的信息,所以我们对这部分组件或模块的需求是既可以使用Pod来进行方便的管理,也需要有相关的权限才可以使用该组件或模块。

实现思路

Cocoapods有自己创建podspec和自定义的pods库索引(Spec Repo)。
我们可以通过自己创建podspec,然后把该podspec push到我们自己创建的需要访问权限的pod索引中来实现该需求。

名?#24335;?#37322;

  1. Spec RepoSpec Repo 其实是一个所有Pods的索引,所有公开的Pods都在这个里面,?#23548;?#19978;它是一个Git仓库Remote端
    Github上,当你使用Cocoapods后它会被Clone到本地的 ~/.cocoapods目录下,进入这个目录可以看到一个master文件夹,这个master文件夹就是官方的Spec Repo了。这个master的目录结构是这样子的:
?#25193;ぉ?Specs
    └── [SPEC_NAME]
        └── [VERSION]
            └── [SPEC_NAME].podspec
  1. podspec : podspec是一个Ruby格式的描述文件,该文件的结构是这样的:
Pod::Spec.new do |s|
  s.name             = "PodTestLibrary"    #名称
  s.version          = "0.1.0"             #版本号
  s.summary          = "Just Testing."     #简短介绍,下面是详细介绍
  s.description      = <<-DESC
                       Testing Private Podspec.

                       * Markdown format.
                       * Don't worry about the indent, we strip it!
                       DESC
  s.homepage         = "https://coding.net/u/wtlucky/p/podTestLibrary"                           #主页,这里要填写可以访问到的地址,不然验证不通过
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"           #截图
  s.license          = 'MIT'              #开源协议
  s.author           = { "wtlucky" => "[email protected]" }                   #作者信息
  s.source           = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "0.1.0" }      #项目地址,这里不支持ssh的地址,验证不通过,只支持HTTP和HTTPS,最好使用HTTPS
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'                       #多媒体介绍地址

  s.platform     = :ios, '7.0'            #支持的平台及版本
  s.requires_arc = true                   #是否使用ARC,如果指定具体文件,则具体的问题使用ARC

  s.source_files = 'Pod/Classes/**/*'     #代码源文件地址,**/*表示Classes目录及其子目录下所有文件,如果有多个目录下则用逗号分开,如果需要在项目中分组显示,这里也要做相应的设置
  s.resource_bundles = {
    'PodTestLibrary' => ['Pod/Assets/*.png']
  }                                       #资源文件地址

  s.public_header_files = 'Pod/Classes/**/*.h'   #公开头文件地址
  s.frameworks = 'UIKit'                  #所需的framework,多个用逗号隔开
  s.dependency 'AFNetworking', '~> 2.3'   #依赖关系,该项目所依赖的其他库,如果有多个需要填写多个s.dependency
end

实现步骤

创建私有podspec包括下面几个步骤:

  1. 创建并设置一个私有的Spec Repo
  2. 创建Pod所需要的项目工程文件,并且有访问的项目版本控制地址;
  3. 创建Pod?#26434;?#30340;podsepc文件;
  4. 本地测试podspec文件是否可用;
  5. 向私有Spec Repo中提交podspec;
  6. 新建测试项目并?#20197;?code>Podfile中增加刚刚制作好的pod并使用;
  7. 更新维护podspec

在这一系列的操作中需要创建两个私有Git仓库,一个作为私有索引表的版本管理仓库,一个作为podspec所关联的项目工程文件的版本管理仓库。

1. 创建私有Spec Repo

我们需要创建一个类似于master的私有Spec Repo, 我们可以Fork官方的Repo,也可以自己创建。由于我们只想添加自己的Pods,没有必要把现有的所有公开的PodsCopy一份。所以创建一个Git仓库,这个仓库可以是私有的也可以是公开的,不过由于我们是要创建一个私有的Spec Repo,还是创建私有的仓库吧。需要注意的是,如果项目中有其他人员共同开发的话,需要给他这个Git仓库??的权限。至于Git仓库托管在那个服务商下,这个可以根据每个人的不同情况来决定。
Remote端仓库创建完成后,在Terminal执行如下命令:

# pod repo add [Private Repo Name] [GitHub HTTPS clone URL]
$ pod repo add Test https://coding.net/wtlucky/WTSpecs.git

如果成功的话,进入 ~/.cocoapods/repos目录下,就可以看到Test这个目录了。
至此,私有Spec Repo创建成功。
PS:如果有其他合作人员共同使用这个私有Spec Repo的话在他有?#26434;?code>Git仓库的权限的前提下执行相同的命令添加这个Spec Repo即可。

2. 创建Pod项目工程

这一步的实质就是创建一个包含我们需要提取的组件功能的一个Demo工程。
如果现在已经有组件项目,并?#20197;贕it版本管理下,那么这一步可以跳过了。
如果组建还在庞大的项目中没有拆分出来,需要从零开始创建一个组件库的话,我建议使用Cocoapods提供的一个工具Using Pod Lib Create来完成第2步和第3步。
现在来介绍下这个工具的使用,在Terminalcd到要创建项目的目录然后执行

$ pod lib create podTestLibrary

之后它会问你一些问题,你根据自己的需求来决定怎么回答,根据提示信息就可以了。问完问题后它回自动执行 pod install命令来创建项目并生成依赖。
生成之后的文件目录如下:

$ tree PodTestLibrary -L 2
PodTestLibrary
?#25193;ぉ?Example                                  #demo APP
│   ?#25193;ぉ?PodTestLibrary
│   ?#25193;ぉ?PodTestLibrary.xcodeproj
│   ?#25193;ぉ?PodTestLibrary.xcworkspace
│   ?#25193;ぉ?Podfile                              #demo APP 的依赖描述文件
│   ?#25193;ぉ?Podfile.lock
│   ?#25193;ぉ?Pods                                  #demo APP 的依赖文件
│   └── Tests
?#25193;ぉ?LICENSE                               #开源协议 默认MIT
?#25193;ぉ?Pod                                       #组件的目录
│   ?#25193;ぉ?Assets                            #资源文件
│   └── Classes                              #类文件
?#25193;ぉ?PodTestLibrary.podspec           #第三步要创建的podspec文件
└── README.md                                #markdown格式的README

9 directories, 5 files

接下来向项目中添加库文件和资源,运行项目并测试,保证我们需要的所有功能都成功实现。为了后续步骤可以顺利通过,建议清除库文件中所有的警告信息。

3. 创建podspec文件

通过Cocoapods创建出来的目录本身就在本地的Git管理下,我们需要做的?#21069;?#20182;推送到远端仓库并打一个Tag,这是Git操作部分的内容,这里就不再叙述了。
做完这些就可以开始编辑podspec文件了,它是一个Ruby文件,把编辑器的格式改为Ruby就可以看到语法高亮,具体文件的各属性含义在上文中有说明。
编辑完podspec文件后要用验证这个文件是否可以使用。如果有任何的WARNINGERROR都是不可以的,不过Xcode中的WARNING是可以存在的,验证需要在Ternimalcdpodspec文件所在目录执行一个命令:

$ pod lib lint

当你看到

 -> PodTestLibrary (0.1.0)

PodTestLibrary passed validation.

?#20445;?#35828;明验证通过了,但是这只是podspec文件是合法的,不一定说明这个pod是可用的, 我们需要在本地做一下验证,这个就是第4步的内容了。
在验证podspec文件是否合法的时候,如果遇到报错,可以通过命令:

$ pod lib lint --verbose

查看详细信息,如果有ERROR,可以通过信息中的[NOTE]提示来解决问题,如果有WARNING并且无法清除,可以通过添?#29992;?#20196;?#38382;?#26469;忽略WARNING

$ pod lib lint --verbose --allow-warning

检查并修改库文件和podspec直到验证通过。

4. 本地测试podspec文件是否可用

我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建好的podspec文件,看是否可以使用。在Podfile中编辑有2种方式:

pod 'PodTestLibrary', :path => '~/code/Cocoapods/podTest/PodTestLibrary'      # 指定路径
pod 'PodTestLibrary', :podspec => '~/code/Cocoapods/podTest/PodTestLibrary/PodTestLibrary.podspec'  # 指定podspec文件

然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/PodTestLibrary中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。

在项目中编?#21019;?#30721;,测试库文件无误后就可以开始下一步了,提交podspecSpec Repo中。

5. 向私有Spec Repo中提交podspec

Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令

$ pod repo push Test PodTestLibrary.podspec  #前面是本地Repo名字 后面是podspec名字

如果执行失败,同样可以通过

$ pod repo push Test PodTestLibrary.podspec --verbose

查看详细信息和通过

$ pod repo push Test PodTestLibrary.podspec --allow-warning

忽略警告。完成之后这个组件库就添加到我们的私有库Test中了,可以进入文件目录~/.cocapods/repos/Test目录下查看。

?#25193;ぉ?LICENSE
?#25193;ぉ?PodTestLibrary
│   └── 0.1.0
│       └── PodTestLibrary.podspec
└── README.md

再去我们的Remote端仓库,也有了一次提交,这个podspec也已经被Push上去了。

至此,我们已经制作好了私有组件库,使用pod search查找新添加的库。

这里介绍的是添加到私有Repo中,如果需要添加到Cocoapods的官方库中,则可以使用Trunk工具,具体可以查看官方文档。

6. 新建测试项目并?#20197;赑odfile中增加刚刚制作好的pod并使用

该步骤和第4步中的本地测试流程一致, 但是在Podfile中通过正常的公共Pod库的添加方式来添加我们的私有Pod

7. 更新维护podspec

现在我们已经成功创建了一个podspec了,剩下的工作就是更新维护了,更新维护涉及到添加新版本和删除pod

我已经制作好了PodTestLibrary0.1.0版本,现在我对他进行升级工作,这次我添加了更多的模块到PodTestLibrary之中,包括工具类,底层ModelUIKit扩展等,这里又尝试了一下subspec功能,给PodTestLibrary创建了多个子分支。

具体做法是先将源文件添加到Pod/Classes中,然后按照不同的模块对文件目录进行整理,因为我有四个模块,所以在Pod/Classes下有创建了四个子目录,完成之后继续编辑之前的PodTestLibrary.podspec,这次增加了subspec特性

Pod::Spec.new do |s|
  s.name             = "PodTestLibrary"
  s.version          = "1.0.0"
  s.summary          = "Just Testing."
  s.description      = <<-DESC
                       Testing Private Podspec.

                       * Markdown format.
                       * Don't worry about the indent, we strip it!
                       DESC
  s.homepage         = "https://coding.net/u/wtlucky/p/podTestLibrary"
  # s.screenshots     = "www.example.com/screenshots_1", "www.example.com/screenshots_2"
  s.license          = 'MIT'
  s.author           = { "wtlucky" => "[email protected]" }
  s.source           = { :git => "https://coding.net/wtlucky/podTestLibrary.git", :tag => "1.0.0" }
  # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>'

  s.platform     = :ios, '7.0'
  s.requires_arc = true

  #s.source_files = 'Pod/Classes/**/*'
  #s.resource_bundles = {
  #  'PodTestLibrary' => ['Pod/Assets/*.png']
  #}
  #s.public_header_files = 'Pod/Classes/**/*.h'

  s.subspec 'NetWorkEngine' do |networkEngine|
      networkEngine.source_files = 'Pod/Classes/NetworkEngine/**/*'
      networkEngine.public_header_files = 'Pod/Classes/NetworkEngine/**/*.h'
      networkEngine.dependency 'AFNetworking', '~> 2.3'
  end

  s.subspec 'DataModel' do |dataModel|
      dataModel.source_files = 'Pod/Classes/DataModel/**/*'
      dataModel.public_header_files = 'Pod/Classes/DataModel/**/*.h'
  end

  s.subspec 'CommonTools' do |commonTools|
      commonTools.source_files = 'Pod/Classes/CommonTools/**/*'
      commonTools.public_header_files = 'Pod/Classes/CommonTools/**/*.h'
      commonTools.dependency 'OpenUDID', '~> 1.0.0'
  end

  s.subspec 'UIKitAddition' do |ui|
      ui.source_files = 'Pod/Classes/UIKitAddition/**/*'
      ui.public_header_files = 'Pod/Classes/UIKitAddition/**/*.h'
      ui.resource = "Pod/Assets/MLSUIKitResource.bundle"
      ui.dependency 'PodTestLibrary/CommonTools'
  end

  s.frameworks = 'UIKit'
  #s.dependency 'AFNetworking', '~> 2.3'
  #s.dependency 'OpenUDID', '~> 1.0.0'
end

因为我们创建了subspec所以项目整体的依赖dependency,源文件source_files,头文件public_header_files,资源文件resource等都移动到了各自的subspec中,每个subspec之间也可以有相互的依赖关系,比如UIKitAddition就依赖于CommonTools

编辑完成之后,在测试项目里pod update一下,几个子项目都被加进项目工程了,?#21019;?#30721;验证无误之后,就可以将这个工程push到远端仓库,并打上新的tag->1.0.0

最后再次使用pod lib lint验证编辑好的podsepc文件,没有自身的WARNING或者ERROR之后,就可以再次提交到Spec Repo中了,命令跟之前是一样的。

最后介绍如何删除一个私有Spec Repo,只需要执行一条命令即可

$ pod repo remove Test

如果我们要删除私有Spec Repo下的某一个podspec怎么操作呢,此时无需借助Cocoapods,只需要到~/.cocoapods/repos/Test目录下,删掉库目录, 然后再将Git的变动推送到Remote仓库即可

以上就是创建私有Pod的全部内容。

参考资料

使用Cocoapods创建私有podspec
Private Pods
Creating a Private Cocoapod
Developing Private In-House Libraries with CocoaPods

iOS
澳门番摊游戏
<tr id="2okqm"></tr>
<sup id="2okqm"><small id="2okqm"></small></sup>
<rt id="2okqm"><optgroup id="2okqm"></optgroup></rt><tr id="2okqm"><optgroup id="2okqm"></optgroup></tr><rt id="2okqm"><center id="2okqm"></center></rt>
<tr id="2okqm"></tr>
<sup id="2okqm"><small id="2okqm"></small></sup>
<rt id="2okqm"><optgroup id="2okqm"></optgroup></rt><tr id="2okqm"><optgroup id="2okqm"></optgroup></tr><rt id="2okqm"><center id="2okqm"></center></rt>
五子棋终结者算法 甘肃十一选五开奖列表 海南飞鱼彩票开售了吗 法甲积分 四不像一肖中特六肖中特 双龙国际娱乐城下载 潮汕赌经豪华版 哪里可以买上海时时彩 一号吉林快三开奖结果 北京快乐8营业时间 云南快乐10分钟遗漏 浙江省体彩 山西十一选五杀号技巧公式 白小姐透码诗 黑龙江11选5前三