提要:

  podfile文件会先读取.podspec文件,根据.podspec文件的指向来下载第三方库到项目中。

  本文先通过一、二、三这三个步骤讲解了如何建立一个"podspec文件在本地.cocoaPod库,第三方库在远程机器"的例子。

  后文中的第四项,讲解了"podspec文件在本地项目中,第三方库在远程机器"的设置方法;最后讲了"podspec文件在本地项目中,第三方库也在本地项目中"的设置方法。第五项,讲解了"podspec文件的语法知识"。

正文讲解:

一、创建需要pod管理的第三方库

(1) 本地创建第三方库起名为lvPodLibrary,用命令创建如下:

  1. sheron_lv@MacLv:~/codeLv/github$ pod lib create lvPodLibrary //输入命令

根据提示回答四个问题,1.是否需要一个例子工程;2.选择一个测试框架;3.是否基于View测试;4.类的前缀。

加入我们要用Pod管理的类,这里直接起名为lvPodLibrary.h和lvPodLibrary.m。

(2)在github上创建New repository,即远端lvPodLibrary库。拿到地址,比如我的是https://github.com/SheronLv/lvPodLibrary.git。把上面创建的本地库push到远端:

  1. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git add .
  2. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git commit -m "Initial Commit of Library"
  3. On branch master
  4. nothing to commit, working directory clean
  5. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git remote add origin https://github.com/SheronLv/lvPodLibrary.git //添加远端仓库
  6. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git push origin master //提交到远端仓库

因为podspec文件中获取第三方库lvPodLibrary这个Git版本控制的项目还需要tag号,所以我们要打上一个tag

  1. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git tag -m "first release" "0.1.0"
  2. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ git push --tags //推送tag到远端仓库

也就是说,我现在推送的lvPodLibrary第三方库是0.1.0版本的。

(3)编辑lvPodLibrary.podspec文件,或者如果这个库是通过其他方式创建的没有这个文件的话,创建lvPodLibrary.podspec文件

  1. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ pod spec create lvPodLibrary https://github.com/SheronLv/lvPodLibrary.git

内容如下:

  1. Pod::Spec.new do |s|
  2. s.name = "lvPodLibrary" #名称
  3. s.version = "0.1.0"
  4. s.summary = "Just Testing" #简短介绍,下面是详细介绍
  5. s.description = <<-DESC
                Testing Testing Testing
  6. DESC
  7. s.homepage = "https://github.com/SheronLv/lvPodLibrary"
  8. s.license = 'MIT'
  9. s.author = { "Sheron lv" => "email@address.com" }
  10. s.platform = :ios, "7.0"
    s.source = { :git => "https://github.com/SheronLv/lvPodLibrary.git", :tag => s.version }
  11. s.source_files = "lvPodLibrary", "lvPodLibrary/**/*.{h,m}"
  12. end

检验.podspec文件是否可用可用

  1. sheron_lv@MacLv:~/codeLv/github/lvPodLibrary$ pod lib lint
  2. -> lvPodLibrary (0.1.)
  3.  
  4. lvPodLibrary passed validation. // 此提示信息表示可用

然后把所有文件push到远端。

二、创建podSpec仓库

(1)在github上创建New repository,作为podSpec的远程仓库,如下图,我在github上创建了一个名为lvPodSpec的仓库。

(3)将远程podSpec仓库添加到本地仓库目录下,即~/.cocoapods/repos目录下。

sheron_lv@MacLv:~$ pod repo add lvPodSpec https://github.com/SheronLv/lvPodSpec.git//输入命令

Cloning spec repo `lvPodSpec` from `https://github.com/SheronLv/lvPodSpec.git` //执行过程、结果

此时本地~/.cocoapods/repos目录下已经有了名为lvPodSpec的仓库。通过pod search命令可以查到这个库的信息:

  1. sheron_lv@MacLv:~/Desktop/lvDemo$ pod search lvPodLibrary
  2. //查到信息如下

-> lvPodLibrary (0.1.0)

Just Testing

pod 'lvPodLibrary', '~> 0.1.0'

- Homepage: https://github.com/SheronLv/lvPodLibrary

- Source:   https://github.com/SheronLv/lvPodLibrary.git

- Versions: 0.1.0 [lvPodSpec repo]

把之前的lvPodLibrary.podspec文件拷贝到本地的lvPodSpec项目中.

然后把所有的内容push到远程lvPodSpec下。(其实可以删掉lvPodLibrary项目下的lvPodLibrary.podspec文件,没有指向它。但现在可以先留着,后面练习直接指向第三方库的.podspec文件可以使用)

(注意:每次更新版本tag,把上级目录的名字也更新,或者建立新的文件夹比如0.1.1、0.1.2,否则无法找到这个版本的.podspec)

三、在新的项目中使用pod管理第三方库

编写这个项目的Podfile如下:

source 'https://github.com/SheronLv/lvPodSpec.git'   //注:如果不添加source句有可能找不到,就会出错

  1. platform:ios,"7.0"
  2.  
  3. inhibit_all_warnings!
  4. target "lvDemo" do
  5. pod 'lvPodLibrary','0.1.0'
  6. end

运行pod install,项目中就出现了要用的lvPodLibrary项目

总结:经过多次实践,以上的三大步骤,其实是以下指向关系:

  1. ()需要使用第三方库的项目中的Podfile指向本地的仓库中的.podspec文件

    例如 Podfile中关键代码

      pod 'lvPodLibrary','0.1.5'

  1. ()本地的.podspec文件指向远程仓库的第三方库的地址
      例如 本地仓库中~/.cocoapods/repos/项目lvPodSpeclvPodLibrary.podspec文件
         s.name         ="lvPodLibrary" 
       s.version      = 0.1.5"
    s.source       = { :git => "https://github.com/SheronLv/lvPodLibrary.git", :tag => s.version }
    s.source_files  = "lvPodLibrary"
    3)远程仓库lvPodLibrary.git

    关键是:

    push时要打tag;

    存放第三方库lvPodLibrary的目录结构与.podspec文件中指定的s.source_files一致。

我们知道,运行pod install时,运行的是本地.cocoapods下的.podspec,远程对应的.podspec和在你要管理的第三库里创建的.podspec都是不起作用的。

四、 PS:  podfile不同写法

(1)

  1. pod 'lvPodLibrary' , :git =>'https://github.com/SheronLv/lvPodLibrary.git', :tag => '0.1.2'

这样,pod会去找远程git地址上,tag是0.1.2的那次提交的代码里的lvPodLibrary.podspec文件,根据lvPodLibrary.podspec文件下载对应的第三方库。

(2)将上文中创建的lvPodLibrary.podspec文件复制到需要依赖该库代码的项目目录下,如本项目demo/spec/lvPodLibrary.podspec,然后修改Podfile中对该库的依赖为:

  1. pod 'lvPodLibrary' , :podspec => './spec/lvPodLibrary.podspec'

执行pod install也会拉到对应的第三方库的代码。

(3)如果第三方库的代码lvPodLibrary不想放到远程,可以通过使用path的方式将代码添加到pod中,如下所示:

  1. #Podfile中这样写
  2. pod 'lvPodLibrary' , :path => './LocalPod/lvPodLibrary.podspec'
  3.  
  4. #.podspec文件中这样写
  5. s.source = { :tag => s.version}
  6. s.source_files = "lvPodLibrary"

注意:这样写时,将文件lvPodLibrary.podspec和第三方库代码lvPodLibrary并列放在本项目的同一文件夹下,比如本项目是LocalPod文件夹,否则找不到第三方库。

五、 podspec语法知识点

  1. Pod::Spec.new do |s|
  2. s.name = "NVUtils"
  3. s.version = "0.0.1"
  4. s.summary = "NVUtils repo"
  5.  
  6. s.description = <<-DESC
  7. NVUtils repo
  8. DESC
  9.  
  10. s.homepage = "http://XXXX/services"
  11. s.license = 'MIT'
  12. s.author = { "SheronLv" => "lvxueyin@hotmail.com" }
  13. s.platform = :ios, "7.0"
  14.  
  15. s.source_files = "NVUtils/*.{h,m}"
  16. s.resources = 'NVUtils/*.{xib,png}'
    //s.source   = { :git => 'https://github.com/ADVProgressBar.git', :commit => 'f17b15c15574d6d101cd5fcfd58239e16e806647' } 
  17. s.requires_arc = true
  18. s.dependency 'Core1'
  19. s.dependency 'Core2'
  20. end

   s.name  声明库的名称

s.summary 库的简短说明文档

s.homepage  声明库的主页(只是告诉了这个url,运行podfile并不会据此把库push到对应的url上)

s.version  库原代码的版本

s.license 所采用的授权版本

s.author 库的作者

s.source 原代码的地址

s.source_files 包含所有源代码的目录,目录的层级关系一定要跟代码文件的保持一致,最后一部分*.{h,m}是一个类似正则表达式的字符串,表示匹配所有以.h和.m为扩展名的文件。

s.resources NVUtils/目录下还有一个NVUtils.bundle目录,该目录存放一些资源文件(如图片等),这些文件并不需要进行编译。可以使用s.resourcs声明。

s.dependency 本库依赖的其他的第三方库

 s.vendored_libraries 指定外部的静态库

对比记忆以下四个设置:

 s.libraries  表示这个pod依赖的 苹果官方的库,也就是类似libstdc++.a ,libsqlite.a 等等的a文件;
   s.vendored_libraries 就表示用户自己的a文件,比如新浪微博SDK的libWeiboSDK.a ;
   s.frameworks 表示pod依赖的 苹果的framework, 比如 UIKit,SystemConfiguration等等
   s.vendored_frameworks, 表示pod依赖的自己的framework,比如QQSDK的TencentOpenAPI.framework;
 
总结如下(引自:https://www.jianshu.com/p/5c67c41766f6):
  1. # 基本信息的配置
  2. name:框架名
  3. version:当前版本(注意,是当前版本,假如你后续更新了新版本,需要修改此处)
  4. summary:简要描述,在pod search的时候会显示该信息。
  5. description:详细描述
  6. homepage:页面链接
  7. license:开源协议
  8. author:作者
  9. platform:支持最低ios版本
  10. swift_version : swift对应的版本
  11.  
  12. # 源文件的配置
  13. source:源码git地址
  14. source_files:源文件(可以包含.h和.m
  15. subspec:子库
  16. public_header_files:头文件(.h文件)
  17. resource_bundles:资源文件(配置的文件会放到你自己指定的bundle中)
  18.  
  19. # 依赖的配置
  20. frameworks:依赖的系统框架
  21. vendored_frameworks:依赖的非系统框架
  22. libraries:依赖的系统库
  23. vendored_libraries:依赖的非系统的静态库
  24. dependency:依赖的三方库

创建podSpec,使用pod管理第三方库的更多相关文章

  1. Xcode工程使用CocoaPods管理第三方库新建工程时出现错误

    工程使用CocoaPods管理第三方库,在新的目录update版本的时候出现如下问题   问题1描述: diff: /../Podfile.lock: No such file or director ...

  2. iOS开发:在Xcode中用Pods管理第三方库

    之前写了一篇 iOS开发:在Swift中调用oc库 ,今天记录一下如何用Pods的方式来管理第三方库,包括Swift/Object-C的库. 在这之前请先查阅Guides.CocoaPods如何使用的 ...

  3. Xcode工程使用CocoaPods管理第三方库新建工程时出现异常

    Xcode工程使用CocoaPods管理第三方库新建工程时出现异常 Xcode工程使用CocoaPods管理第三方库新建工程时出现错误工程使用CocoaPods管理第三方库,在新的目录update版本 ...

  4. Cocoapod安装 - 管理第三方库

    在我们开发移动应用的时候,一般都会使用到第三方工具,而由于第三方类库的种类繁多,我们在项目中进行管理也会相对麻烦,所以此时我们就需要一个包管理工具,在iOS开发中,我们使用最多的就是Cocoapods ...

  5. pod引用第三方库的几种方式

    pod引用库的原理,本质上是去找.podspec文件,podspec中包含库的地址及最新的版本号(tag标签),如果pod时没有指定版本,则pod install时会去下载podspec文件中指定的最 ...

  6. iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法

    在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...

  7. Swift: 在Swift中桥接OC文件(自己创建的类文件、第三方库文件)

    一.介绍 随着Swift的逐渐成熟,使用swift开发或者混合开发已经成为了一个趋势,本身苹果公司也十分推荐使用Swift这门新语言.目前Swift已经更新到了3.0,估计没有多久4.0就要出来了.那 ...

  8. xcode中用pods管理第三方库<转>

    安装pods :http://www.cnblogs.com/wangluochong/p/5567082.html 史上最详细的CocoaPods安装教程 --------------------- ...

  9. vue-cli创建的项目中引入第三方库报错 'caller', 'calle', and 'arguments' properties may not be...

    http://blog.csdn.net/sophie_u/article/details/76223978 以在vue中引入mui第三方库为例: 虽然针对vue,有单独的vue-mui库可以使用,但 ...

随机推荐

  1. ural 1268. Little Chu

    1268. Little Chu Time limit: 0.25 secondMemory limit: 64 MB The favorite occupation of Little Chu is ...

  2. Equipment Box[HDU1110]

    Equipment Box Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  3. BZOJ1845 : [Cqoi2005] 三角形面积并

    求出所有交点后从左往右扫描线,用每段的中位线去截所有三角形,算出长度并后乘以该段长度即可,时间复杂度$O(n^3\log n)$. #include<cstdio> #include< ...

  4. BZOJ1665 : [Usaco2006 Open]The Climbing Wall 攀岩

    直接BFS貌似复杂度飞起来了,于是我们用k-d tree优化找点的过程即可.时间复杂度$O(n\sqrt{n})$. #include<cstdio> #include<algori ...

  5. BZOJ3325 : [Scoi2013]密码

    从以每一位为中心的回文串长度可以用Manacher倒推出$O(n)$对相等和不等关系. 将相等的用并查集维护,不等的连边. 然后输出方案时若还没被染过色,则求一个mex. #include<cs ...

  6. BZOJ2862 : 分糖果

    二分答案$x$表示最大的一段的和. 设$f[i]$表示前$i$个最多分几段,满足最大的一段不超过$x$,若$f[n]\geq k$,则可行, 则$f[i]=\max(f[j])+1,sum[i]-su ...

  7. A Complete Guide to the <Picture> Element

    If you’ve ever struggled building responsive websites, this post is for you. It’s part of a series o ...

  8. 去掉 wap (android/ios)网页等点击后的阴影

    tap后会出现一个半透明的灰色背景,(被批...),起初以为是outline作怪,加上后发现没反应,最后发现是tap后的背景高亮,要重设这个表现,则需要设置-webkit-tap-highlight- ...

  9. topcoder SRM 594 DIV2 AstronomicalRecordsEasy

    此题主要考查的是求最长公共子序列 设A[i]:A[j] = a:b = ac:bc       B[ii]:B[jj] = c:d = ac:ad , 如果A[i]:A[j] = B[ii]:B[jj ...

  10. 李洪强-C语言1-指针

    C语言指针 前导程序   一.基本知识点 Int a=10; Int *p;//定义一个int类型的指针 P=&a;//指针变量p指向了变量a *p=20;//使用指针不通过变量直接修改变量a ...