Podfile是一个描述一个或多个Xcode项目的目标依赖项的规范。
前言
Podfile制定每个target的依赖关系,pod是声明特定依赖项关系,podspec提供了一个简单的API来创建podspecs,target是Xcode项目中的特定目标。
Podfile基础用法
在项目中我们执行完pod install后再目录下会生成Podfile。删除一些注释,添加AFNetwirking后1我们得到了这样的文件。
这是平时大家用的做多的方式。
下面我们写一个复杂点的例子🌰
pod - 指定项目的依赖项
- pod 【pod名称】
pod 'MJExtension'
- pod 【pod名称】【版本】
pod 'MJExtension', '~> 3.0.15.1'
- pod 【pod名称】【版本范围】
> 1.0.0 高于1.0.0版本(不包含1.0.0版本)的任意一个版本
>= 1.0.0 高于1.0.0版本(包含1.0.0版本)的任意一个版本
< 1.0.0 低于1.0.0版本(不包含1.0.0版本)的任意一个
<= 1.0.0 低于1.0.0版本(包含1.0.0版本)的任意一个
~> 1.0.0 版本 1.0.0的版本到2.0.0 ,不包括2.0.0。这个基于你指定的版本号的最后一个部分。这个例子等效于>= 1.0.0并且 <2.0.0
Build configurations - 编译配置
指定单独依赖库启用
pod 'MJExtension', :configurations => ['Debug', 'AdHoc']
这样写使MJExtension 在Debug, AdHoc 启用配置。
['Debug', 'AdHoc'] 是一个环境参数集合。
我们也可以指定一个环境,像这样:
pod 'MJExtension', :configuration => 'Debug'
Subspecs
开发日常中我们会通过依赖库的名称来引入,cocoapods会默认安装依赖库的所有内容。
我们也可以指定安装具体依赖库的某个子模块,例如:
pod 'AFNetworking/Reachability'

但我们需要某个依赖里的两个Subspecs怎么写呢
pod 'AFNetworking', :subspecs => ['Reachability','Security']

引入本地文件
我们也可以指定依赖库的来源地址。如果我们想引入我们本地的一个库,可以这样写:
pod 'AFNetworking', :path => '~/Documents/AFNetworking'
这样写,Cocoapods会将给定的文件夹认为是Pod的源,建立关联,并且在项目中直接引用这些文件。这就意味着你编辑的部分可以保留在CocoaPods安装中,如果我们更新本地AFNetworking里面的代码,cocoapods也会自动更新。
引用仓库根目录的podspec
引入依赖库指定的分支或节点
- 引入master分支(默认)
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
- 引入指定的分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :branch => 'dev'
- 引入某个节点的代码
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :tag => '0.7.0'
- 引入某个特殊的提交节点
pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git', :commit => '082f8319af'
use_frameworks!
通过指定use_frameworks!要求生成的是framework而不是静态库。
Workspace
默认情况下Podfile和工程名一样,当我们想指定的另外的名称
workspace 'projectworkspace'
pre_install
当我们下载完成,但是还没有安装之时,可以使用hook机制通过pre_install指定要做更改,更改完之后进入安装阶段。
pre_install do |installer|
# 做安装之前的更改
end
def
上面图片里有提到,这是用来声明一个pod集合:
def 'myPods'
end
主要用来区分多个target引入不同的依赖。
source 'http://192.168.127.69/YY/ASLSpecs.git'
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
inhibit_all_warnings!
def dtPods
#--------------
pod 'Aspects', '~> 1.4.1'
pod 'SDWebImage', '~> 4.4.1'
pod 'MJExtension', '~> 3.0.15.1'
pod 'CTMediator', '~> 18'
pod 'MJRefresh', '~> 3.1.15.3'
pod 'AFNetworking', '~> 3.2.1'
pod 'YTKNetwork', '~> 2.0.4'
pod 'ReactiveObjC', '~> 3.1.0'
pod 'ZBarSDK', '~> 1.3.1'
pod 'WechatOpenSDK', '~> 1.8.2'
pod 'Masonry', '~> 1.1.0'
#--------------
pod 'RTLabel', '~> 1.0.1'
pod 'YJBannerView', '~> 2.4.0'
pod 'TZImagePickerController', '~> 2.1.8'
pod 'MGSwipeTableCell', '~> 1.6.7'
pod 'IQKeyboardManager', '~> 6.0.5'
pod 'UITableView-BMTemplateLayoutCell', '~> 2.0.0'
pod 'WebViewJavascriptBridge', '~> 6.0.3'
#--------------
pod 'Bugly', '~> 2.5.0'
#--------------
pod 'UMCCommon', '~> 1.5.2'
pod 'UMCCommonLog', '~> 1.0.0'
pod 'UMCAnalytics', '~> 5.5.0'
#--------------
pod 'SSZipArchive', '~> 1.1'
#--------------
#本地测试 例子
# pod 'IMXTipsShowUtil',:path => "/Users/yaoquanfeng/Desktop/IMXTipsShowUtil"
# DT iOS team pod
pod 'DTGuideView'
pod 'DTExtension'
pod 'IMXStyleKit', '~> 0.1.0'
pod 'IMXTipsShowUtil'
end
target 'ASL' do
dtPods
end
target 'ASL_AdHoc' do
dtPods
# debug module
pod 'FLEX', '2.4.0'
pod 'pop', '1.0.10'
pod 'FBMemoryProfiler', '0.1.3'
pod 'FBAllocationTracker', '0.1.5'
pod 'FBRetainCycleDetector', '0.1.3'
end
上面是一个简单的例子
基础的就介绍到这吧,现在我们说一下高级用法
Podfile 高级用法
前面有说到Ruby语法,也就是说我们可以在Podfile中添加一些脚本和逻辑来控制项目依赖。
看完教程我们举一个应用场景:
- 多个target
- 支持本地库引用
- 支持参数化依赖
支持本地库依赖
大家都知道私有库应用的时候是需要打tag并且推送到远端的,但是在项目开发阶段我们一般引入本地库,用来保证高效的开发(引入本地路径上面有提到),这时如果有协同开发人员,我们需要保证本地依赖库的路径统一。
实战
举个🌰:
前提:
- 将pods(clone 下来的pod集合)放在和项目同级目录下
- 引入本地库的时候不加版本号,引入的全是本地最新版本
- 上线的时候,引入的是打版本号的依赖
可能用到的语法:
str.blank? // 判断字符串是否有值
case Str
when type1
when type2
end
// 条件判断语句
source.each do | str |
end
// 循环遍历语句
上面的语法是Ruby的基础使用
知道了上面的语法后,我们就可以创建rudy文件,并在profile中引用了
注:ruby文件和profile在同级目录下
在Podfile中
load xxx.rd
至于内容怎么写,根据业务场景就好啦,这里就不描述了
参考: