@[TOC](cocoapod 实现 ios 组件化)
cocoapod 实现 ios 组件化
一 cocoa pod 使用
1. cocoa pod 安装,更新,删除
1.1 安装更新
(1)、快速安装
连接📱无线热点,这会大大加快安装 CocoaPods 的速度。
删除自带的 ruby 镜像,终端输入:gem sources --remove https://rubygems.org/。
添加淘宝的镜像,终端输入:gem sources -a https://gems.ruby-china.org/
检查替换镜像是否成功,终端输入:gem sources -l,如下图所示:
更新 Ruby,终端输入:sudo gem update --system。
安装 CocoaPods,终端输入:sudo gem install -n /usr/local/bin cocoapods。
等待……
查看 CocoaPods 是否安装成功,终端输入:pod --version。
安装 CocoaPods,终端输入:pod setup。
经过一段时间等待,至此 CocoaPods 安装成功。
(2)、使用 CocoaPods
新建项目,用终端打开项目文件夹,终端输入:cd 项目文件夹名称。
创建 Podfile 文件,终端输入:vim Podfile。
进入 Podfile 文件后输入 i 进入编辑状态,按如下格式输入要安装的框架:
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'AFNetworking', '~> 2.6'
pod 'ORStackView', '~> 3.0'
pod 'SwiftyJSON', '~> 2.3'
end
写完后按 Esc 然后 :wq 意思是保存并退出,然后输入:pod install。到此安装成功,退出 Xcode,打开 .xcworkspace后缀的文件即可。
(3)以前项目中使用过Pods 1.0,最近项目中也有用到,因为很长时间没用了,所以配置了下,谁知道,中间出现了不少坑,特记录在此博客,其实pods的使用也就是几个终端命令而已,可能随着系统的升级,以前的终端命令,会因为电脑里面配置了其他的环境,比如react native 等,会影响到pos的配置
安装过程如下:
1,打开终端,输入命令:"gem sources -l"来查看镜像是否被墙,如图(下面的镜像是我替换过以后的图像),注:这里输出如果是:https://rubygems.org/ 镜像的话,我们要删除这个镜像,然后添加镜像:https://ruby.taobao.org/ ,
具体操作如下:
<1>删除原始镜像:gem sources --remove https://rubygems.org/
<2>添加新的镜像:gem sources -a https://ruby.taobao.org/
<3>查看是否更改成功:在此输入命令,如下图:(就修改成功了)
3,接下来我们要进行安装pods的重要步骤了:(sudo gem install -n /usr/local/bin cocoapods)
注意:在这个过程中,会出现一些错误,具体的错误可以自行百度,这里只列举我安装时遇到的几个比较典型的例子:因为配置过react native的环境(自己百度的),所以在失败过几次后,我就从电脑里面把react navtive的环境给删除掉了,
可以参考:http://www.jianshu.com/p/77f02887630e
如果一切顺利,大概过了个10分钟,如果你网速特别慢的话,可以多等等,如果出现下图,就表示安装成功了
4,接下来我们检测是否安装成功:直接输入pod 然后按两下tab键,可以看到下图:
或者直接输入终端命令:pod search AFNetworking,出现下图:
即为安装成功.
如果没有出现,不要慌,打印下 pod命令:pod --version ,如果出现下图:
![](https://img.haomeiwen.com/i10798403/0c460dd77e23fd2d.png)
表示安装成功,如果没有,别急,往下看,可能是master的问题,也可能是gem的问题,ruby的问题,
我遇到的是:Pod /usr/bin/git clone https://github.com/CocoaPods/Specs.git master 问题,可以参考:http://www.jianshu.com/p/90ca71b3b94a
碰到的问题,这篇大神波可以有很详细的解答,如果直接出现上图,恭喜你安装成功!~
别高兴的太早,安装成功,可不意味着,直接可以用了,想知道怎么用吗,?接着往下看:
1,在桌面上创建一个项目,然后使用CD命令:cd /Users/hero11223/Desktop/CocoaPodTest ,切换到此目录下如图:
![](https://img.haomeiwen.com/i10798403/c4f908fd2b102fb4.png)
2,上面是demo的根目录,然后我们要创建Podfile文件,命令如下:touch Podfile
这里就不上图了,直接输入命令就行,然后打开桌面demo的文件夹,会出现一个Podfile的文件,如图:
出现这个文件,然表示我们创建成功了!
接下来,操作Podfile文件,有两种方法:
第一种:使用vim命令,如下:
(1)比如我们要导入AFNetworking这个第三方库,我们执行如下命令:pod search AFNetworking,如下图:
红框框中的就是我们要写入到Podfile中的文件;
(2)使用vim命令,输入命令:vim Podfile ,然后点击 i ,下面会出现INSERT的字样,这个时候,我们就可以写入类库了,注:这里的写入命令和以前有了不一样,具体如下图:
里面的MyAPP就是你demo的名字,比如我的demo名字是:CocoaPodTest,直接替换掉就可以了,
platform :ios, '8.0'
use_frameworks!
target 'CocoaPodTest' do
pod 'AFNetworking', '~> 3.1.0'
end
写入完成后,我们要怎么退出vim呢,写入完成后,我们点击左上角的ESC键,然后下面的INSERT字样,消失,我们输入一个":"号,然后输入wq,(wq的意思是保存退出的意思),然后回车,
最后再输入:
pod install
或者 pod install --verbose 命令,耐心等待1分钟左右的时间,如果出现下图:
就表示你已经成功导入AFNetworking第三方库了;
然后我们打开项目,看到:
如果出现红框框里面的东西,就表示彻底成功了!
如果遇到什么问题,比如,pods安装成功,导入不成功,
可以参考:http://blog.csdn.net/jxt141014_150214/article/details/54092482
第二种方法:就是直接在Podfile文件里面写入,最后在终端里面输入此命令:pod install --verbose --no-repo-update ,就可以了,不过我一直用的第一种方法,第二种方法的话,没有尝试,有兴趣的朋友可以尝试下!
如何在工程中导入第三方库的头文件呢:
点击“+”号添加一项:并且输入:“$(PODS_ROOT)”(没有引号),选择:recursive(会在相应的目录递归搜索文件),如下图:
使用cocopods更新类库:
在终端输入:pod update 或 pod repo update,就可以了~!
补充:
出现这种错误:
<span style="font-family:SimSun;color:#ffffff;background-color: rgb(0, 0, 0);">E325: ATTENTION
Found a swap file by the name ".ceshi.c.swp"
owned by: root dated: Sat Jul 4 19:51:46 2015
file name: /c/ceshi.c
modified: YES
user name: root host name: c66-WR
process ID: 2801
While opening file "ceshi.c"
dated: Sun Jul 5 12:38:54 2015
NEWER than swap file!
解决Swap file ".ceshi.c.swp" already exists!问题
关于swp文件:使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测,如果你正常退出,那么这个.(filename)swp文件将会自动删除。
因此.(filename)swp文件就是你没有正常退出vi或者vim编辑器时留下来的!比如:强行关闭vi或vim时,电源突然断掉,或者你使用了Ctrl-zz。(正常的退出方式应该是Shift-ZZ)
这时候就会出现下面的情况了
重点:解决办法
用下面的命令删除swp文件
rm .{your file name}.swp
例如:我的文件名是ceshi.c 那么就用这样的命令:rm .ceshi.c.swp (当然你前面也可以加-rf强制删除)
亲测有效!
1.2 pod 多人开发更新库
1.2.1 pod install, pod update 区别
许多人开始使用CocodPods的时候认为pod install只是你第一次用CocoaPods建立工程的时候使用,而之后都是使用pod update,但实际上并不是那会事。简单来说,就是:1.使用pod install来安装新的库,即使你的工程里面已经有了Podfile,并且已经执行过pod install命令了;所以即使你是添加或移除库,都应该使用pod install。2.使用pod update [PODNAME] 只有在你需要更新库到更新的版本时候用。
-
pod install :
这个是第一次在工程里面使用pods的时候使用,并且,也是每次你编辑你的Podfile(添加、移除、更新)的时候使用。每次运行pod install命令的时候,在下载、安装新的库的同时,也会把你安装的每个库的版本都写在了Podfile.lock文件里面。这个文件记录你每个安装库的版本号,并且锁定了这些版本。当你使用pod install它只解决了pods里面,但不在Podfile.lock文件里面的那些库之间的依赖。对于在Podfile.lock里面所列出的那些库,会下载在Podfile.lock里面明确的版本,并不会去检查是否该库有新的版本。对于还不在Podfile.lock里面的库,会找到Podfile里面描述对应版本(例如:pod "MyPod", "~>1.2")。 -
pod outdated:
当你运行pod outdated命令,CocoaPods会列出那些所有较Podfile.lock里面有新版本的库(那些当前被安装着的库的版本)。这个意思就是,如果你运行pod update PODNAME,如果这个库有新的版本,并且新版本仍然符合在Podfile里的限制,它就会被更新。 -
pod update:
当你运行 pod update PODNAME 命令时,CocoaPods会帮你更新到这个库的新版本,而不需要考虑Podfile.lock里面的限制,它会更新到这个库尽可能的新版本,只要符合Podfile里面的版本限制。如果你运行pod update,后面没有跟库的名字,CocoaPods就会更新每一个Podfile里面的库到尽可能的最新版本。
正确用法:你应该使用pod update PODNAME去只更新某个特定的库(检查是否有新版本,并尽可能更新到新的版本)。对应的,你应该使用pod install,这个命令不会更新那些已经安装了的库。当你在你的Podfile里面添加了一个库的时候,你应该使用pod install,而不是pod update,这样既安装了这个库,也不需要去更新其它的已安装库。你应该使用pod update去更新某个特定的库,或者所有的库(在Podfile的限制中)。提交你的Podfile.lock文件:在此提醒,即使你一向以来,不commit你的Pods文件夹到远程仓库,你也应该commit并push到远程仓库中。要不然,就会破坏整个逻辑,没有了Podfile.lock限制你的Pods中的库的版本。 -
举例:
以下会举例说明在各个场景下的使用。
-
场景1:
User1创建了一个工程User1创建了一个工程,并且想使用A、B、C这三个库,所以他就创建了一个含有这个三个库的Podfile,并且运行了pod intall。这样就会安装了A、B、C三个库到这个工程里面,假设我们的版本都为1.0.0。因此Podfile.lock跟踪并记录A、B、C这三个库以及版本号1.0.0。顺便说一下:由于这个工程是第一次运行pod install,并且Pods.xcodeproj工程文件还不存在,所以这个命令也会同时创建Pods.xcodeproj以及.xcworkspace工程文件,这只是这个命令的一个副作用,并不是主要目的。 -
场景2:
User1添加了一个库之后,User1添加了一个库D到Podfile文件中。然后他就应该运行pod install命令了。所以即使库B的开发者发布了B的一个新版本1.1.0。但只要是在第一次执行pod install之后发布的,那么B的版本仍然是1.0.0。因为User1只是希望添加一个新库D,不希望更新库B。这就是很多人容易出错的地方,因为他们在这里使用了pod update,因为想着“更新我的工程一个新的库而已”。这里要注意! -
场景3:
User2加入到这个工程中然后,User2,一个之前没有参与到这个工程的人,加入了。他clone了一份仓库,然后使用pod install命令。Podfile.lock的内容就会保证User1和User2会得到完全一样的pods,前提是Podfile.lock被提交到git仓库中。即使库C的版本已经更新到了1.2.0,User2仍然会使用C的1.0.0版本,因为C已经在Podfile.lock里面注册过了,C的1.0.0版本已经被Podfile.lock锁住了。 -
场景4:
检查某个库的新版本之后,User1想检查pods里面是否有可用的更新时,他执行了pod outdated,这个命令执行后,会列出来:B有了1.1.0版本,C有了1.2.0版本。这时候,User1打算更新库B,但不更新库C,所以执行pod update B,这样就把B从1.0.0更新到1.1.0(同时更新Podfile.lock里面对B的版本记录),此时,C仍然是1.0.0版本,不会更新。在Podfile中使用明确版本还不够有些人认为在Podfile中明确某个库的版本,例如:pod 'A', '1.0.0' ,足以保证所有项目里面的人都会使用完全一样的版本。这个时候,他们可能会觉得,此时如果添加一个新库的时候,我使用pod update并不会去更新其它的库,因为其它的库已经被限定了固定的版本号。但事实上,这不足以保证User1和User2的pods中库的版本会完全一样。 -
一个典型的例子是,如果库A有一个对库A2的依赖(声明在A.podspec中:dependency 'A2', '~> 3.0'),如果这样的话,使用 pod 'A', '1.0.0' 在你的Podfile中,的确会让User1和User2都使用同样版本的库A(1.0.0),然而:最后User1可能使用A的依赖库A2的版本为3.4(因为3.4是当时User1使用的最新版本),但User2使用的库A2版本是3.5(假设A2的开发者刚刚发布了A2的新版本3.5)。所以只有一个方法来保证某项目的每个开发者都使用相同版本的库,就是每个电脑中都使用同样的Podfile.lock,并且合理使用pod install 和 pod update。
网友评论