不识庐山真面目,只缘身在此山中html
原文连接ios
CocoaPods是OS X和iOS下的一个第三类库管理工具,经过CocoaPods工具咱们能够为项目添加被称为“Pods”的依赖库(这些类库必须是CocoaPods自己所支持的),而且能够轻松管理其版本。c++
iOS程序依赖管理工具还有Carthage(Carthage 是由 Swift 语言写的,只支持动态框架,只支持 iOS8+),工程中能够Carthage和CocoaPods一块儿存在使用,可是建议使用一种,我的推荐CocoaPods。git
CocoaPods项目源码github
CocoaPods须要Ruby环境,安装Ruby和修改ruby镜像命令以下:(Mac自带 Ruby)json
#安装ruby
gem install ruby
#升级ruby
sudo gem update --system
#检查版本
ruby -v
# 更新ruby镜像
gem sources --remove https://rubygems.org/
gem sources -a https://ruby.taobao.org/
#检查镜像是否更新成功
gem sources -l
复制代码
下载和卸载命令缓存
#下载最新版本
sudo gem install cocoapods (sudo gem install -n /usr/local/bin cocoapods)
#下载指定版本
sudo gem install cocoapods -v 1.6.1
#卸载
sudo gem uninstall cocoapods
#卸载指定版本
sudo gem uninstall cocoapods -v 1.6.1
#检查pod版本
pod --version
复制代码
还能够在工程目录下,使用Gemfile
来指定使用cocoapods的版本。ruby
gem "cocoapods", '~> 1.6.1'
复制代码
建立Podfile文件bash
#进入项目根路径中执行,生成Podfile文件(若是有Podfile文件不用执行pod init)
pod init
复制代码
说明:Podfile文件详细描述了一个或多个工程中targets的依赖关系服务器
Podfile添加第三方库依赖
target 'QSAppDemo' do
pod 'AFNetworking'
pod 'YYModel', '~> 1.0.4'
pod 'OOMDetector', '1.3'
# Debug模式下生效
pod 'FLEX', '~> 2.0', :configurations => ['Debug']
pod 'WebViewJavascriptBridge', :git => 'https://github.com/marcuswestin/WebViewJavascriptBridge.git'
end
复制代码
下载和安装第三方库
pod install
复制代码
说明1:下载成功后,使用CocoaPods 生成的 .xcworkspace 文件来打开工程;每次更改了 Podfile 文件,要从新执行一次pod update命令;
说明2:发生执行pod install
或pod update
都卡在Analyzing dependencies
的状况,是由于要升级CocoaPods的spec仓库,命令后添加--verbose --no-repo-update
参数能够省略此步。
若是依赖项后不指定版本,默认取最新版本
pod 'OOMDetector'
复制代码
若是依赖项后跟上特定版本,就是使用指定版本
pod 'OOMDetector'
复制代码
> 0.1
高于0.1版本(不包含0.1版本)的任意一个版本
>= 0.1
高于0.1版本(包含0.1版本)的任意一个版本
< 0.1
低于0.1版本(不包含0.1版本)的任意一个
<= 0.1
低于0.1版本(包含0.1版本)的任意一个
~> 0.1.2
版本 0.1.2的版本到0.2 ,不包括0.2。这个基于你指定的版本号的最后一个部分。这个例子等效于>= 0.1.2而且 <0.2.0,而且始终是你指定范围内的最新版本。
引入master分支(默认)
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
复制代码
引入指定的分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'develop'
复制代码
引入某个节点的代码
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '2.7.0'
复制代码
引入某个特殊的提交节点
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git', :commit => '685e31a31bb1ebce3fdb5a752e392dfd8263e169'
复制代码
Source:指定pod的来源。若是不指定source,默认是使用CocoaPods官方的source
# 使用官方默认地址(默认)
source 'https://github.com/CocoaPods/Specs.git'
复制代码
use_frameworks!:使用此命令会在Pods工程下的Frameworks目录下生成依赖库的framework,若是不使用,会在Pods工程下的Products目录下生成.a的静态库。
target 'QSAppDemo' do
use_frameworks!
end
复制代码
关于Pofile的详细语法能够参考: Podfile Syntax Reference 或 Podfile文件用法详解
因为业务须要,须要开发某业务SDK,方便公司内业务接入,选择使用建立私有Pod库;
本质上,建立公有Pod库或者私有Pod库原理是同样的,不同的是:二者的版本索引查询方式不同, 公有库的podspec由CocoaPods/Specs管理, 而内部私有使用的pod库须要公司内部创建一个仓库来管理podspec。
私有spec repo的构建形式有两种, 一种是私有git服务器上面建立,一种是本机建立;通常是在公司内部搭建的git服务器上面建立私有spec repo
#将远程的私有版本仓库添加到本地
pod repo add qs_private_pods_specs https://github.com/buaa0300/qs_private_pods_specs.git
#添加成功后,打开~/.cocoapods/repos能够看到新增的qs_private_pods_specs
复制代码
pod lib create QSBizSDK # QSBizSDK是SDK的名字
What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> ObjC
Would you like to include a demo application with your library? [ Yes / No ]
> YES
Which testing frameworks will you use? [ Specta / Kiwi / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No
What is your class prefix?
> QS
......
复制代码
说明1:pod lib create QSBizSDK
实际上是下载了一个pod模板,而后在内部经过更改.podspec文件的配置定制化本身的pod,podspec是描述pod的说明信息的。 说明2: pod lib create ProjectName
其实使用了默认参数,补全的话pod lib create ProjectName --template-url=https://github.com/CocoaPods/pod-template.git
说明3: 将项目托管到Git,私有库通常上传到内部的仓库中。
Pod::Spec.new do |s|
s.name = 'QSBizSDK'
s.version = '1.0.0'
s.summary = 'A short description of QSBizSDK.'
s.description = <<-DESC Add long description of the pod here. DESC
s.homepage = 'https://github.com/buaa0300/QSBizSDK'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = {'南华coder' => 'buaa0300@qq.com'}
s.source = { :git => 'https://github.com/buaa0300/QSBizSDK.git', :tag => s.version.to_s }
s.ios.deployment_target = '8.0'
s.default_subspec = 'QSCore'
# 各个子模块的个自的源码路径
s.subspec 'QSCore' do |qscore|
qscore.source_files = 'Classes/QSCore/**/*'
end
# A a 必定要不同,是别名,添加好暴露的头文件
s.subspec 'A' do |a|
a.source_files = 'Classes/QSCore/A/**/*'
a.public_header_files='Classes/QSCore/A/*.h'
end
# 能够添加内部本身模块,或者外部的依赖
s.subspec 'B' do |b|
a.source_files = 'Classes/QSCore/B/**/*'
a.public_header_files='Classes/QSCore/B/*.h'
b.dependency 'Classes/QSCore/A'
b.dependency 'AFNetworking', '~> 3.0'
b.frameworks = 'SystemConfiguration', 'CFNetwork', 'PassKit'
b.libraries = 'c++', 'z'
end
s.subspec 'C' do |c|
c.source_files = 'Classes/QSCore/C/**/*'
c.dependency 'Classes/QSCore/B'
end
end
复制代码
说明:对于一个功能比较多的SDK,podspec中须要作的事情比较多,如利用subspec将代码模块化,方便使用时按需导入;不一样的模块可能依赖framework、静态库、内部其余模块,也须要处理好;
说明2:可使用pod spec lint xxx.podspec
来检查podspec的配置有效性
pod repo push qs_private_pods_specs QSBizSDK.podspec
复制代码
说明:添加成功以后qs_private_pods_specs
中会包含QSBizSDK库的podspec信息, 能够前往~/.cocoapods/repos
下的qs_private_pods_specs
文件夹中查看, 同时git服务器中的远端也更新了.
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_setting["ENABLE_BITCODE"] = 'NO'
end
end
end
复制代码
#查看本地pod缓存
pod cache list
#清除某个库缓存
pod cache clean xxxx
# 清除全部pod缓存
pod cache clean -all
#删除缓存方法
rm ~/Library/Caches/Cocoapods/Pods/Pods/Release
复制代码
# 更新库命令
pod repo update
# 删除 search_index.json 文件
rm ~/Library/Caches/CocoaPods/search_index.json
复制代码