Cocopods之Podfile你要知道的

3,828 阅读4分钟

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']

这样写使MJExtensionDebug, 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中添加一些脚本和逻辑来控制项目依赖。

Ruby教程

看完教程我们举一个应用场景:

  • 多个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

至于内容怎么写,根据业务场景就好啦,这里就不描述了

参考:

Podfile语法参考