学习使用CocoaPods后涨的姿势

基本介绍

Cocoapods是非常好用的一个iOS依赖管理工具,使用它可以方便的管理和更新项目中所使用到的第三方库,以及将自己的项目中的公共组件交由它去管理。

解决了什么问题

没有CocoaPods时,我们的工程配置需要

  1. 手动增加framework,library

  2. 手动增加编译参数

  3. 手动维护代码更新;

现在,我们只需要设置一个Podfile文件,执行pod install

CocoaPods会帮我们下载好代码,设置好编译参数,配置好framework, library。

安装和使用教程

这个看一篇我之前的博客:

CocoaPod安装和使用教程

CocoaPods支持私有Spec仓库

整体先说明一下创建一个私有的podspec包括如下那么几个步骤:

  1. 创建并设置一个私有的Spec Repo;
  2. 创建Pod的所需要的项目工程文件,并且有可访问的项目版本控制地址;
  3. 创建Pod所对应的podspec文件;
  4. 本地测试配置好的podspec文件是否可用;
  5. 向私有的Spec Repo中提交podspec;
  6. 更新维护podspec;

创建私有Spec Repo

先来说第一步,什么是Spec Repo?他是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,他实际是一个Git仓库remote端

在GitHub上,但是当你使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的

1
2
3
4
5
├── Spec
└── [SPEC_NAME
└── [VERSION
└── [SPEC_NAME].podspe

因此我们需要创建一个类似于master的私有Spec Repo。所以创建一个Git仓库,这个仓库你可以创建私有的也可以创建公开的,不过既然私有的Spec Repo,还是创建私有的仓库吧,需要注意的就是如果项目中有其他同事共同开发的话,你还要给他这个Git仓库的权限。

创建完成之后在Terminal中执行如下命令

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

此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到WTSpecs这个目录了。至此第一步创建私有Spec Repo完成。

创建Pod所对应的podspec文件

  1. 新建 podspec,填写需要上传的文

    1
    2
    #该命令执行之后,CocoaPods 会生成一个名为your_pod_spec_name.podspec的文件,然后我们修改其中的相关内容即可
    pod spec create your_pod_spec_nam
  2. 修改podspec文件(字面意思很容易看懂,描述了打包的一些参数信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    Pod::Spec.new do |s|
    s.name = "MyModule"
    s.version = "0.0.1"
    s.summary = "li jian fei App 5.0+ version MyModule."
    s.description = <<-DESC
    噜啦啦德玛西亚,吧啦吧啦
    这里配置了打包的一些参数信息
    一般情况下无需更改
    DESC
    s.homepage = "http://lijianfei.sinaapp.com"
    s.license = "Copyright 2015 lijianfei.sinaapp.com"
    s.author = { "ios_lijianfei" => "leejeffery@foxmail.com" }
    s.platform = :ios, "7.0"
    s.source = { :git => "https://github.com/lijianfei1023/Quickblox-IM.git", :tag => s.version.to_s }
    s.resource = "MyModule/MyModule-Info.plist"
    s.resources = "MyModule/Image/*.png"
    s.ios.deployment_target = '7.0'
    s.dependency 'AFNetworking'
    s.source_files = "MyModule/**/*.{h,m}", "$(PODS_ROOT)/**/*.h"
    s.exclude_files = "MyModule/main.m"
    s.public_header_files = "MyModule/**/*.h", "$(PODS_ROOT)/**/*.h"
    s.prefix_header_file = "MyModule/MyModule-Prefix.pch"
    s.frameworks = "QuartzCore","CoreGraphics", "Foundation", "UIKit", "AdSupport","objc"
    s.library = "sqlite3","c++", "z"
    s.requires_arc = true
    end
  3. 本地验证 podspec 是否有

    1
    pod spec lint MyModule.podspec --verbose --sources=https://github.com/lijianfei1023/Quickblox-IM.git --no-clean --use-libraries

    以下为忽略警告的命

    1
    pod spec lint MyModule.podspec --verbose --sources=https://github.com/lijianfei1023/Quickblox-IM.git --no-clean --use-libraries --allow-warnings

Cocoapods的高级用法

指定源

CocoaPods支持私有 Spec 仓库的,我们可以建立自己的源,也可以使用非官方的源,只要是符合规定的都可以指定。

1
2
source 'https://github.com/artsy/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'

抑制警告

inhibit_warnings参数能够有效的抑制CocoaPods引入的第三方代码库产生的warning。

全部指定

1
inhibit_all_warnings!

针对指定

1
pod 'ReactiveCocoa', '~> 2.4', :inhibit_warnings => true

使用git的HEAD指向的分支

1
pod 'ISO8601DateFormatter', :head

使用 master 分支

1
pod 'ARAnalytics/Mixpanel', :git => 'https://github.com/orta/ARAnalytics.git'

指定branch

1
pod 'Reachability', :git => 'https://github.com/ashfurrow/Reachability.git', :branch => 'frameworks'

指定tag

1
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'

指定commit

1
pod 'ARTiledImageView', :git => 'https://github.com/dblockARTiledImageView', :commit => '1a31b864d1d56b1aaed0816c10bb55cf2e078bb8'

使用子库

单个子库

1
pod 'QueryKit/Attribute'

多个子库

1
pod 'QueryKit', :subspecs => ['Attribute', 'QuerySet']

使用本地代码

通过:path可以指定本地代码,不过需要确保目录包含podspec文件。

1
pod 'AFNetworking', :path => '~/Documents/AFNetworking'

指定target的依赖库

1
2
3
target :ZipApp do
pod 'SSZipArchive
end

排除taget

1
2
3
target 'Artsy Tests', :exclusive => true do
pod 'FBSnapshotTestCase', '1.4'
end

指定xcodeproj

默认会使用Podfile文件同级目录下第一个xcodeproj,但也可以指定

1
2
3
4
5
xcodeproj 'MyProject'
target :test do
# This Pods library links with a target in another project.
xcodeproj 'TestProject'
end

指定连接的target

如果不显式指定连接的target,Pods会默认连接project的第一个target。如果需要,可以使用link_with指定连接一个或多个target

1
link_with 'MyApp', 'MyOtherApp'

指定环境

如下只会在Debug环境下面加入PonyDebugger库到工程。

1
pod 'PonyDebugger', :configuration => ['Debug']

指定target的配置文件

1
xcodeproj 'TestProject', 'Mac App Store' => :release, 'Test' => :debug

使用Dynamic Frameworks代替Static Libraries

通过标志use_frameworks!就可知开启这个功能。如果需要使用Swift的库,就必须加上这个标志了。

加快pod install/update 速度

使用CocoaPods来添加第三方类库,无论是执行pod install还是pod updat很多时候都卡在了Analyzing dependencies不动,这是更新本地的pod spec所以文件导致的。通过–no-repo-update标志可以不更新本地pod spec索引。当然首次install不应该添加这个标志,后续修改Podfile的时候可以适当使用,加快pod速度。

1
2
pod install --no-repo-updat
pod update --no-repo-update

输出详细日志

1
pod update --verbose

XCode的Cocoapods插件

cocoapods-xcode-plugin是一个XCode的插件,让你方便操作Cocoapods。

版本引用

1
2
3
4
5
6
7
8
9
pod 'AFNetworking' //不显式指定依赖库版本,表示每次都获取最新版本
pod 'AFNetworking', '2.0' //只使用2.0版本
pod 'AFNetworking', '> 2.0' //使用高于2.0的版本
pod 'AFNetworking', '>= 2.0' //使用大于或等于2.0的版本
pod 'AFNetworking', '< 2.0' //使用小于2.0的版本
pod 'AFNetworking', '<= 2.0' //使用小于或等于2.0的版本
pod 'AFNetworking', '~> 0.1.2' //使用大于等于0.1.2但小于0.2的版本
pod 'AFNetworking', '~>0.1' //使用大于等于0.1但小于1.0的版本
pod 'AFNetworking', '~>0' //高于0的版本,写这个限制和什么都不写是一个效果,都表示使用最新版本
李剑飞 wechat
欢迎订阅我的微信公众号"剑飞说"!
坚持原创技术分享,您的支持将鼓励我继续创作!