cocoapods是什么?别问我
现在cocoapods的普及无需多说,本文也不详述它的心路历程,有兴趣的读者可以自行Google相关资料。好了闲话不多说,进入正题。
都在用的东西能不能更好用?
当我们首次使用cocoapods管理工程里面引用的开源库时,那感觉如沐春风、久旱甘霖都不算夸张。但奈何公司使用的是svn管理代码,时间久了,就有一些类似分享的小集成、数据统计的之类的小代码,它们都在svn上,每次新工程需要引用的时候。额,真烦,要拖这么多文件,真烦要引用的库都没说明白。。。
这时候就在想,要是引用公司的代码也能像Github上一样就爽了,今天和大家一起学习下吧。
其实在cocoapods官网是有说明的,是支持svn的,不光svn,还有其他地方托管的git,本地的代码库都是可以的,说白了source只是一个地址。
我是这么做的!
第一步,把svn的代码check out到本地,cd到该目录下,使用pod命令创建一个podspec文件。
$ pod spec create DemoLibrary
第二步,打开文件,看看里面的东西。
s.name = "UleNetWork"
s.version = "1.0"
s.summary = "apply for new App UleNetWork."
s.description = <<-DESC
apply for new App UleNetWork.
DESC
s.license = {:type => "MIT", :file => "LICENSE"}
s.platform = :ios, "7.0"
s.source = { :svn => "" }
s.source_files = "Classes", "Classes/**/*.{h,m}"
s.exclude_files = "Classes/Exclude"
s.framework = "Foundation"
# s.frameworks = "SomeFramework", "AnotherFramework"
s.requires_arc = true
# s.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }
s.dependency "AFNetworking", "~> 3.1"
s.dependency "JSONModel", "~> 1.2.0"
这个设置是我已经改了的设置,和默认的设置有一些地方不一样,其中name是你的库名,version是版本号,description是要求有必须写点东西的,license的文件可以随便找一个修改下放到目录下,关键的还是source、source_files、exclude_files我待会儿说,framework或frameworks就是库需要引入的framework这个功能是极好的,dependency添加依赖的开源库,也是方便至极。
第三步,source内容
当我们用的svn时候
s.source = { :svn => "http://svn.baidu.com/baidu/mobileclient/iPhone/BaiduCodeLibrary/DemoLibrary/" }
细心的你应该发现了在默认的时候是有一个tags的存在的,我这里因为我们那个svn没有加这些东西,我就删掉了。
这样做有一个缺点,我们的库用于是获取这个地址下最新的那套代码,这个问题,以后研究下吧。
地址我是瞎写的。
s.source_files = "Classes", "Classes/**/*.{h,m}"
当你按照上面的形式操作了,发现你下载下来的代码只是一个空的文件夹,关键就在source_files,这个指定了要Classes文件下的文件,这样做有什么好处么?当然有,试想一下,你的路径是一个完整的工程,你只需要传实用的代码,这样做能够让你的工程不受影响,随意debug。
第四步,这样的路径就是正确的!
好了一切就绪,现在只需要把你的svn刚才的修改上传一下,使用pod install。
第五步,为什么会报错?
Authentication realm: R&D Source Code Repositories
其实你svn的check out代码的时候需要输入账户和密码,这里可以在终端先随意check out一下代码,就会有缓存,重新再执行下就ok了。
1、checkout
svn checkout svn地址,简写: svn co svn地址
成功了,好爽啊,一起happy吧。
这是test工程的pod文件内容,和podspce文件的svn地址是一样的。
第六步,没有tag管理好不像样
===============================================
补充关于tag设置
===============================================
设置tag其实还是很简单的,我这里使用的是cornrstone管理svn代码。由于的我的文件目录以前是没有这个trunk和tags文件夹设置的,这里呢我需要在DemoLibrary目录下新建一个tags文件夹
然后呢在cornrstone的控制台,选到工程路径注意不是本地的,是svn的,然后选择顶部tag选项。不要忘了在podspce文件里修改你将设置成的版本!
弹出一个框框
使用工程的应用pod文件:
pod'UleNetWork', :svn =>"http://svn.baidu.com/baidu/mobileclient/iPhone/BaiduCodeLibrary/DemoLibrary/",:tag =>"1.0.1"
好了,完美!
----------------------------------------------------------------------------
20160829 补充
----------------------------------------------------------------------------
当tag版本未改变,修改了本地代码,需要清除pod缓存在本地的内容并且需要将pod file文件中引用该库注释先删除,再添加执行两次pod install,否则不会使用新代码。(~/Library/Caches/CocoaPods/Pods/External)
说明pod在本地有缓存,需要清除,并且只用该工程中的pod移除过之后,再次添加时才会去都去更新。
----------------------------------------------------------------------------
20160913 补充SVN库之间的引用
----------------------------------------------------------------------------
在使用cocoapods的过程中不难发现,有一些库是依赖其他的库的,当我们使用的是cocoapods上的代码库只需要
s.dependency 'UlePayBaseSDK', "~> 1.0.0"
当我们使用SVN路径上的库时,当然也需要这句话,但是你会发现,有错误。因为这时候并没有cocoapods缓存在本地的库,所以在工程文件podfile地方需要先pod该库
pod'UleSecurityKit', :svn =>"...UleSecurityKit/",:tag =>"1.0.0"
相信大家都发现了,这样比起官方的pod代码来说,多了这一个主动pod的动作。需要注意
===============================================
回复网友的疑问事例
===============================================
这是一个简单的事例,我这里UleShareSDK就是一个分享的集成库,当我需要QQ分享、微博分享、微信分享的时候,另外在SVN中存有它们不同版本的SDK,这个是引用工程的podfile里写的。