一、CocoaPods简介
iOS 和 OS X下的一个第三方库管理工具,类似的iOS工具还有Carthage(比较轻量级,需要手动配置,非侵入式),与Java里的Maven也比较类似,但是没有maven的构建、运行程序、打包等功能,仅仅是库依赖配置和库版本管理工具。
作用:依赖库版本管理、库依赖自动配置;
二、安装与使用
安装
- sudo gem install cocoapods
由于被墙,通常需要切换gem源
查看gem源
gem sources -l
删除gem源
gem sources --remove https://ruby.taobao.org/
修改gem源
gem sources -a https://gems.ruby-china.org
- pod setup
在本地建立一个Cocoapods里描述文件主仓库,然后建立远程库索引,出现Setup completed 则安装完成
基本使用
- 命令pod search xx, 查找库相关信息
- podfile配置
Podfile文件描述了工程中一个或者多个Target的依赖关系。Podfile会默认创建一个隐式的Target链接到工程中用户的第一个target,名称未“default”;
简单的Podfile
pod 'AFNetworking', '~> 1.0'
复杂的Podfile
platform :ios, '9.0'
inhibit_all_warnings!
target 'MyApp' do
pod 'ObjectiveSugar', '~> 0.5'
target "MyAppTests" do
inherit! :search_paths
pod 'OCMock', '~> 2.0.1'
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
puts "#{target.name}"
end
end
依赖配置
pod 'Lib' 或者 pod 'Lib', '1.0.1' 或者 pod 'lib', ~>'1.0.1'
指定了依赖库的名称和版本
- 不填,默认使用最新版本
- = 0.1
- > 0.1
- >= 0.1
- < 0.1
- <= 0.1
- ~> 0.1.2 等价于 0.1.2<=版本<0.2.0, 并使用这个范围内最新的版本。
pod一些用法
pod 'Objection', :head使用指定spec下最新可用版本,会强制下载高风险版本
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :branch => 'dev'
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :tag => '0.7.0'
Target 语法
target 'name' do
pod xxx
end
指定target对应的依赖库
其他一些不常用的语法如:podspec、abstract_target、abstract!、inherit!。
Sources
source 'https://github.com/CocoaPods/Specs.git'
Podfile从这里去搜索specs,全局定义,不能定义在单独一个Target里。
编译配置
platform
platform ios, '8.0' 或 platform (不填写)
目前的默认设置是iOS4.3、OS X10.6、tvOS 9.0、watchOS 2.0
use_frameworks!
该命令的作用是让依赖库使用framework的方式被主工程使用,否则是以静态库的形式;
framework:系统的framework是动态库(dylib),自己开发的framework是静态库.
framework = 头文件 + .a + 资源文件
用途:
当OC和Swift库互相引用的时候,原本需要使用XXX-Bridging-Header.h桥接文件来导入,使用framework方式则可以直接像本语言里导入头文件方式import "AFNetwork/AFNetwork.h"
使用了use_frameworks!
未使用use_frameworks!(使用.a的静态链接库方式)
其他不常用的还有inhibit_all_warnings!、link_with、project。
Hooks、Workspace、Root Options等内容配置官方文档。
- 依赖库安装
pod install
工程目录
- 运行
执行.xcworkplace文件
- 头文件导入
三、内部详解
文件组成说明
-
Podfile
描述本工程第三方库的依赖关系
Podfile.lock 和 Pods/Manifest.lock
Podfile.lock描述了pod install之后各个依赖库的具体版本,主要作用是在Podfile里未具体指定版本号的情况下,保证协同开发人员使用的版本一致;除非修改了Podfile文件或者使用pod update 'PodName',否则Podfile.lock不会更新。
举个例子:
sequenceDiagram
A->>Podfile: pod install
Podfile->>Podfile.lock: 描述了准备的依赖库版本号
Podfile.lock->>Repo: 版本控制
B->>Repo: 拉去代码, 包括Podfile、Podfile.lock;
B 从仓库拉下代码,也执行pod install,这个时候未具体指定版本号的依赖库不再是拉去最新版本或者其他一些规则,而是根据Podfile.lock里的版本去下载依赖库,这样就保证了大家使用的是同一个版本。
Manifest.lock是存放在Pods目录下的,这个目录一般不加入git版本控制;也是在pod install之后生成,是Podfile.lock的拷贝,主要作用是为了校验已经安装的依赖库和Podfile.lock里的是否一致,保证大家使用相同的依赖版本。
pod install具体的执行过程:
pod install --verbose 或者pod install --no-repo-update --verbose
Preparing
Analyzing dependencies
Inspecting targets to integrate
Using `ARCHS` setting to build architectures of target
`Pods-LiveStream_IM_Demo`: (``)
Finding Podfile changes
- Masonry
- RealReachability
- SVProgressHUD
- YYKeyboardManager
- YYModel
- YYText
- YYWebImage
Resolving dependencies of `Podfile`
Comparing resolved specification to the sandbox manifest
- Masonry
- RealReachability
- SVProgressHUD
- YYCache
- YYImage
- YYKeyboardManager
- YYModel
- YYText
- YYWebImage
Downloading dependencies
-> Using Masonry (1.0.2)
-> Using RealReachability (1.1.8)
-> Using SVProgressHUD (2.1.2)
-> Using YYCache (1.0.4)
-> Using YYImage (1.0.4)
-> Using YYKeyboardManager (1.0.1)
-> Using YYModel (1.0.4)
-> Using YYText (1.0.7)
-> Using YYWebImage (1.0.5)
- Running pre install hooks
Generating Pods project
- Creating Pods project
- Adding source files to Pods project
- Adding frameworks to Pods project
- Adding libraries to Pods project
- Adding resources to Pods project
- Linking headers
- Installing targets
- Installing target `Masonry` iOS 6.0
- Installing target `RealReachability` iOS 6.0
- Installing target `SVProgressHUD` iOS 7.0
- Installing target `YYCache` iOS 6.0
- Installing target `YYImage` iOS 6.0
- Installing target `YYKeyboardManager` iOS 6.0
- Installing target `YYModel` iOS 6.0
- Installing target `YYText` iOS 6.0
- Installing target `YYWebImage` iOS 6.0
- Installing target `Pods-LiveStream_IM_Demo` iOS 8.0
- Running post install hooks
- Writing Xcode project file to `Pods/Pods.xcodeproj`
- Generating deterministic UUIDs
- Writing Lockfile in `Podfile.lock`
- Writing Manifest in `Pods/Manifest.lock`
Integrating client project
Integrating target `Pods-LiveStream_IM_Demo` (`LiveStream_IM_Demo.xcodeproj` project)
- Running post install hooks
- cocoapods-stats from
`/Users/netease/.rvm/gems/ruby-2.3.0@global/gems/cocoapods-stats-1.0.0/lib/cocoapods_plugin.rb`
Sending stats
- Masonry, 1.0.2
- RealReachability, 1.1.8
- SVProgressHUD, 2.1.2
- YYCache, 1.0.4
- YYImage, 1.0.4
- YYKeyboardManager, 1.0.1
- YYModel, 1.0.4
- YYText, 1.0.7
- YYWebImage, 1.0.5
-> Pod installation complete! There are 7 dependencies from the Podfile and 9 total pods installed.
[!] Automatically assigning platform ios with version 8.0 on target LiveStream_IM_Demo because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
- 'Inspecting targets to integrate',确定项目的架构;
- 'Finding Podfile changes',
- 'Resolving dependencies of
Podfile
', 解析Podfile文件 - 下载依赖库文件
- 生成一个Pods.project
- 添加源文件
- 添加frameworkworks
- 静态库
- 资源
- 链接头文件
- 对每个依赖库在Pods.project中生成一个target
- 生成Podfile.lock文件
- 生成Pods/Manifest.lock文件
- 与原有的工程集成
pod outdated
当你运行pod outdated命令,CocoaPods会列出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)。
pod update
当你运行 pod update PODNAME 命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile里面的版本限制。
如果你运行pod update,后面没有跟库的名字,CocoaPods就会更新每一个Podfile里面的库到尽可能的最新版本。
四、podspec制作
步骤
- 创建库工程,添加git,
$ git add .
$ git commit -m ""
$ git push origin master
podspec文件中需要配置tag号,所以需要打一个tag
$ git tag -m "comments" "0.1.2"
$ git push --tags
- 创建podspec配置文件
pod spec create Name
自动生成Name.podspec文件
Pod::Spec.new do |s|
s.name = "iOS_Category"
s.version = "0.1.2"
s.summary = "all kinds of categories for iOS develop"
s.description = <<-DESC
this project provide all kinds of categories for iOS developer
DESC
s.homepage = "https://github.com/sevenuncler/iOS_Category"
s.license = "MIT"
s.license = { :type => "MIT", :file => "LICENSE" }
s.author = { "fanghe" => "[email protected]" }
s.platform = :ios
s.source = { :git => "https://github.com/fanghe/iOS_Category.git", :tag => "0.0.1" }
s.source_files = "Classes", "iOS_Category/Classes/**/*.{h,m}"
s.exclude_files = "Classes/Exclude"
s.public_header_files = "iOS_Category/Classes/UIKit/UI_Categories.h","iOS_Category/Classes/Foundation/Foundation_Category.h","iOS_Category/Classes/**/*.h"
s.requires_arc = true
end
- 验证文件
pod lib lint
任何的编译错误、警告、源文件找不到、podspec文件缺少一些必须的配置项都会验证失败;
如果有警告
$ pod lib lint --allow-warnings
如果有错误可以添加--verbose查看具体的错误信息
$ pod lib lint --verbose
验证通过:
- pod trunk上传到库配置文件到远程Cocoapods仓库
$ pod trunk register [email protected] 'Orta Therox' --description='macbook pro'
首先需要使用个人邮箱注册一个账号,在本地设备上建立一个session,不需要密码,根据当前注册设备自动提供session令牌。
$ pod trunk push Name.podspec
验证远程仓库,成功之后将.podspec文件推送到Cocoapods官方库,这个过程比较耗时间;
- 查看自己的库是否添加成功
$ pod search SUAdvancedPlayer
找不到自己写的
rm ~/Library/Caches/CocoaPods/search_index.json
再次输入
$ pod search SUAdvancePlayer
参考链接
http://www.jianshu.com/p/a1d2d148fdd3
http://blog.jobbole.com/53365/
https://guides.cocoapods.org/syntax/podfile.html#group_target_configuration
http://www.jianshu.com/p/8af475c4f717