http://www.iwangke.me/2013/04/18/advanced-cocoapods/

粉笔网的iOS工程师唐巧曾经写过一篇blog《使用CocoaPods来做iOS程序的包依赖管理》介绍了基本的CocoaPods使用方法。本文将另外谈一谈如何使用CocoaPods进行本地的包管理。建议没有接触过CococaPods的朋友先阅读一下唐巧的blog。

为什么要进行本地的包管理

  • 有的时候CocoaPods的spec版本过旧,pull request没有及时merge,导致我们无法利用CocoaPods使用较新的代码版本;
  • 有的时候我们的一些代码不是开源的,或者暂时不想放到Github上。我们更想使用CocoaPods引用本地的代码;

使用CocoaPods里没有的第三方库新版本

这里我们以PlayHavenSDK为例介绍一下。我们在CocoaPods / Spec这个repository里面可以看到,PlayHavenSDK的版本是1.11.0。而playhaven
/ sdk-ios
里面的tag,已经有了1.12.1这个版本。CocoaPods的Spec repository已经落后了两个版本。这时我们想使用最新版,需要的就是一个更新的spec。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Pod::Spec.new do |s|
s.name = 'PlayHavenSDK'
s.version = '1.12.1'
s.license = 'MIT'
s.summary = 'PlayHaven is a real-time mobile game marketing platform to help you take control of the business of your games.'
s.homepage = 'http://playhaven.com'
s.author = { 'Sam Stewart' => 'sam@playhaven.com' }
s.source = { :git => 'https://github.com/playhaven/sdk-ios.git', :tag => '1.12.1' }
s.description = "PlayHaven is a real-time mobile game marketing platform to help you take control of the business of your games. Acquire, retain, re-engage, and monetize your players with the help of PlayHaven's powerful marketing platform. Integrate once and embrace the flexibility of the web as you build, schedule, deploy, and analyze your in-game promotions and monetization in real-time through PlayHaven's easy-to-use, web-based dashboard. An API token and secret is required to use this SDK. These tokens uniquely identify your app to PlayHaven and prevent others from making requests to the API on your behalf. To get a token and secret, please visit the PlayHaven developer dashboard at https://dashboard.playhaven.com."
s.platform = :ios
# PlayHaven includes prefixed versions of SBJson and OpenUDID
s.source_files = 'Cache', 'src', 'WaterWorks', 'JSON', 'OpenUDID'
s.frameworks = 'SystemConfiguration', 'CFNetwork', 'StoreKit', 'CoreGraphics', 'QuartzCore'
s.weak_frameworks = 'AdSupport'
end

这里我们注意到s.source这一行配置,指向了playhaven/sdk-ios.git仓库的1.12.1这个tag,表示这个spec将使用这个tag的代码。我们将它保存到本地的一个目录中,如~/Desktop/PlayHavenSDK/PlayHavenSDK.podspec

我们回到Xcode project目录中,打开Podfile,添加pod 'PlayHavenSDK', :podspec => '~/Desktop/PlayHavenSDK/PlayHavenSDK.podspec',接着运行pod
update
即可。

PS: 当然这个podspec也可以不放在本地,比如放在gist上。

使用CocoaPods管理本地代码

这种情况稍微复杂一步,除了指定podspec,还需要准备一个本地要使用的git repository。我们以Chartboost为例来进行说明。

首先我们新建一个名为~/Desktop/ChartboostSDK/的目录,然后执行git
init
初始化这个git repository。

接着我们去Chartboost官方网站下载最早新的SDK。将它放进这个目录中,然后执行git add . && git commit -m"Add new SDK"

这样我们这个目录已经成为一个git repository,里面是最新的Chartboost SDK。

这时我们仍然需要一个podspec文件,来说明我们从哪个仓库来获取代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Pod::Spec.new do |s|
s.name = 'ChartboostSDK'
s.version = '3.1.1'
s.license = 'Commercial'
s.summary = 'ChartboostSDK for showing ads and more apps pages, and tracking analytics and in-app purchase revenue.'
s.homepage = 'https://chartboost.com/'
s.author = { 'Chartboost' => 'https://chartboost.com/' }
s.source = { :git => '~/Desktop/ChartboostSDK' }
s.platform = :ios
s.source_files = '**/*.h'
s.preserve_paths = '**/*.a'
s.library = 'Chartboost'
s.xcconfig = { 'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/ChartboostSDK/Chartboost"' }
s.weak_frameworks = 'AdSupport', 'StoreKit'
s.frameworks = 'QuartzCore', 'SystemConfiguration', 'CoreGraphics'
end

我们运行ls -lh | awk '{print $9}',ChartboostSDK目录的结构显示如下:

1
2
3
4
CBAnalytics.h
Chartboost.h
ChartboostSDK.podspec
libChartboost.a

除了两个.h,一个.a,还有一个podspec文件。

接着我们回到Xcode proj所在的文件夹中,编辑Podfile,添加pod 'ChartboostSDK', :local => '~/Desktop/ChartboostSDK'。这里的local表明从本地的git仓库里获取代码。

最后我们运行pod update,大功告成。

CocoaPods小结

上面的两种情况,简单来说:

  • 需要使用最新的开源代码/库,但没最新的spec
  • 需要使用私有代码/库,需要对应的私有的spec

对于第一种情况,建议大家可以给CocoaPods / Specs提交一个pull request。

使用CocoaPods只需要知道两件事情:

  • podspec:一个pod的配置是什么,pod的代码放在哪里
  • Podfile:项目依赖哪个pod,以何种方式依赖,它的podspec放在哪里

这里podspec和git repository都非常灵活,可以放在本地,也可以放到github/gist上。代码仓库甚至可以不使用git而直接使用一个zip压缩包。

使用CocoaPods可以把多们从繁重的配置和代码管理中解脱出来,而且可以少犯错误。比如Deployment Target设置为5.0,但App中需要使用AdSupport.framework,如果忘记设置为optional则所有5.x的设备运行时都会crash。对于这种情况CocoaPods在spec提供了weak_frameworks的配置选项。同时CocoaPods能够保证库的依赖关系,而不会出现几个项目依赖版本不一致的情况。

PS: 最近为了UDID更新的同学们可别犯AdSupport.framework这个错误,后果很严重。

希望这个blog对大家使用CocoaPods有所帮助。

赶个时髦,祝大家一帆风顺

CocoaPods进阶:本地包管理的更多相关文章

  1. Cocoa包管理器之CocoaPods详解

    CocoaPods在Cocoa开发日常工作中经常用到的包管理器,即依赖管理工具.有的项目也有用Carthage的,Carthage是一个比较新的依赖管理工具,是使用Swift语言开发的.Carthag ...

  2. Cocoa包管理器之Carthage详解及CocoaPods中心化+Carthage的二进制化

    上篇博客详细的聊了CocoaPods的相关内容,今天我们就来介绍另一个Cocoa的包管理器Carthage.在上家公司用Swift开发工程时,用的就是Carthage.Carthage诞生于14年11 ...

  3. iOS包管理工具Cocoapods的安装与使用

    转自:http://www.sxt.cn/u/10014/blog/6448 在我们开发移动应用的时候,一般都会使用到第三方工具,而由于第三方类库的种类繁多,我们在项目中进行管理也会相对麻烦,所以此时 ...

  4. 【程序包管理】本地yum仓库的创建

    一.yum优势 yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器 ...

  5. Net包管理NuGet(4)打包nuget包的进阶用法

    nuget包不止可以放进dll,还可以引用其他包,创建项目文件及替换配置文件 引用的时候同时引用依赖项假设引用某个dll需要依赖其他的dll如Zeta.Core.dll需要引用ZETA.Seriali ...

  6. iOS - CocoaPods 第三方开源框架管理

    1.CocoaPods CocoaPods 是一个负责管理 iOS 项目中第三方开源库的工具.CocoaPods 的项目源码在 Github 上管理.该项目开始于 2011 年 8 月 12 日,在这 ...

  7. Carthage 包管理工具,另一种敏捷轻快的 iOS & MAC 开发体验 | SwiftCafe 咖啡时光

    说起 iOS 开发的包管理,大家就不由得会想起 CocoaPods, 它确实是一个强大的工具.但这次咱们来关注另外一个包管理工具 Carthage,如果说 CocoaPods 像一个航母,一应俱全,坚 ...

  8. Linux程序包管理之yum及源代码安装

    第十六章.Linux程序包管理之yum及源代码安装 目录 yum介绍 yum配置文件 yum的repo配置文件中可用的变量 yum命令的使用 使用光盘作为本地yum仓库 如何创建yum仓库 编译安装的 ...

  9. 包管理工具Carthage使用

    iOS项目中第三方开源库的工具有Cocoapods和Carthage,swift官方出了一个包管理工具SPM(Swift Package Manager). 首先,大体讲一下Cocoapods和Car ...

随机推荐

  1. python 操作openpyxl导出Excel 设置单元格格式以及合并处理

    贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fil ...

  2. MVC 源码系列之控制器执行(二)

    ## 控制器的执行 上一节说道Controller中的ActionInvoker.InvokeAction public virtual bool InvokeAction(ControllerCon ...

  3. python接口自动化:响应内容中json字符串对象的处理

    实现代码如下: import json #定义一个字典.一个列表.两个字符串({}中必须是双引号) di1={"} di2=[{"}] di3='{"name" ...

  4. AWS Cloud Practioner 官方课程笔记 - Part 1

    课程笔记: 1. 3种访问AWS服务的方式: GUI, CLI, SDK 前两种是用户用来访问的,SDK可以让程序调用去访问服务. 2. core services 以及通用的use cases Am ...

  5. Maven-Eclipse使用maven创建HelloWorld Java项目,使用Junit-4.11的注解

    1.针对前面创建的mavenTest项目,我们做一些修改,包括pom.xml.App.java.AppTest.java 说明:其中的scope属性,如果是test,表示该依赖只对测试有效,如果不声明 ...

  6. 牛客小白月赛16 A 小石的签到题 ( 博弈)

    链接:https://ac.nowcoder.com/acm/contest/949/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  7. 工作中常见的hive语句总结

    hive的启动: 1.启动hadoop2.开启 metastore 在开启 hiveserver2服务nohup hive --service metastore >> log.out 2 ...

  8. 打乱一个排好序的 list 对象 alist?

    1. import random 2. random.shuffle(alist)

  9. Mysql日期和字符的相互转换

    今天从网上查到了一些关于MySQL数据库的日期转换函数的转换的用法,在这里记录一下: mysql日期和字符相互转换 date_format(date,'%Y-%m-%d') ------------- ...

  10. Maya2017下载安装与激活

    目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 百度云 3. 安装激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/c ...