最近接手一個(gè)項(xiàng)目是組件化做的滞乙,雖然完成了功能迭代,還是系統(tǒng)的學(xué)習(xí)了一下
當(dāng)一個(gè)項(xiàng)目迭代的版本非常多鉴嗤,這基本就算一個(gè)大的項(xiàng)目了斩启,而且功能比較復(fù)雜,可能做這個(gè)項(xiàng)目經(jīng)歷了很多人醉锅,而且每個(gè)人的代碼風(fēng)格不一樣兔簇,如果新人接手那就是一臉的懵逼。如果項(xiàng)目有清晰的結(jié)構(gòu)和模塊 硬耍,任何人接手這個(gè)項(xiàng)目都比較清晰垄琐,組件化有功能模塊,基本的UI和工具模塊经柴,業(yè)務(wù)模塊狸窘,而之間的銜接就是通過一種叫路由的方式來完成,每個(gè)類之間的依賴比較小坯认,就達(dá)到了解藕的目的朦前,通常都是用cocopods來管理每個(gè)模塊
先來看看Cocoapods的原理
image
cocoapods有一個(gè)遠(yuǎn)程索引庫(kù)介杆,當(dāng)我們執(zhí)行pod setup 的時(shí)候,把遠(yuǎn)程索引庫(kù)里的東西全部拷貝到本地韭寸,pod search 的時(shí)候會(huì)去本地索引庫(kù)中查找,查找的時(shí)候是根據(jù)一個(gè)json文件去查找的
這個(gè)索引庫(kù)里面還有一個(gè).spec 文件荆隘,這個(gè)文件里包括一些框架的名稱恩伺,版本號(hào),源地址椰拒,當(dāng)執(zhí)行pod install 的時(shí)候晶渠,就會(huì)根據(jù)這個(gè)文件的源地址去下載,下載完以后生成一個(gè)profile.lock文件燃观,這里面就是你下載的框架名稱褒脯,還有版本號(hào)(如果在profile中沒有制定版本號(hào) 下載的就是最新的版本),如果再往profile中添加新的庫(kù)缆毁,最好執(zhí)行pod install,這個(gè)命令會(huì)先檢索lock文件有沒有這個(gè)庫(kù)番川,沒有再去下載,如果執(zhí)行 pod update脊框,這個(gè)命令直接就會(huì)下載最新的庫(kù)颁督,多人開發(fā)的時(shí)候,如果沒有指定版本號(hào)就會(huì)出問題浇雹,提交的時(shí)候只需要提交podfile和profile.lock文件沉御,別的pods等等文件可以不用提交
由于github上面建立私有倉(cāng)庫(kù)是需要money的,所以我用的碼云的私有庫(kù)
cocopods的目錄在~/.cocoapods ,里面有一個(gè)spec文件,這就是cocopods的spec文件,里面包括很多的庫(kù)昭灵,當(dāng)我們創(chuàng)建私有庫(kù)的時(shí)候吠裆,里面不止有一個(gè)spec文件,使用pod repo 可以查看spec文件烂完,
image
master 是cocopods的庫(kù),HBSpec是我自己的庫(kù),通過pod repo add HBSpec可以創(chuàng)建试疙,如果只是本地庫(kù),可以不用這個(gè)庫(kù)窜护,遠(yuǎn)程的話就得創(chuàng)建效斑,因?yàn)樾枰h(yuǎn)程庫(kù)同步的
spec文件
Pod::Spec.new do |spec|
spec.name = "TextLib" //名字
spec.version = "0.0.1" //版本號(hào),本地基本不用柱徙,主要是遠(yuǎn)程缓屠,會(huì)跟遠(yuǎn)程git中的tag綁定,遠(yuǎn)程庫(kù)的版本號(hào)就是tag
spec.summary = "A short description of TextLib."http://描述 必須比description 短
spec.description = <<-DESC//描述
DESC
spec.homepage = "http://EXAMPLE/TextLib"http://主頁(yè)
# spec.screenshots = "www.example.com/screenshots_1.gif", "www.example.com/screenshots_2.gif"
spec.license = "MIT"http://許可證 我記得MIT是麻省理工大學(xué)的意思
# spec.license = { :type => "MIT", :file => "FILE_LICENSE" }
spec.author = { "XBDZ" => "18730261828@163.com" }//作者
# Or just: spec.author = "XBDZ"
# spec.authors = { "XBDZ" => "18730261828@163.com" }
# spec.social_media_url = "https://twitter.com/XBDZ"
# spec.platform = :ios
# spec.platform = :ios, "5.0"
# When using multiple platforms
# spec.ios.deployment_target = "5.0"
spec.source = { :git => "http://EXAMPLE/TextLib.git", :tag => "#{spec.version}" }//源碼地址护侮,#{spec.version}會(huì)訪問 spec.version
spec.source_files = "Classes", "Classes/**/*.{h,m}"http://Classes下面所有文件中的.h 和.m 文件 可以加上swift和xib等等
spec.exclude_files = "Classes/Exclude"
# spec.public_header_files = "Classes/**/*.h"
# spec.resource = "icon.png"
# spec.resources = "Resources/*.png"
# spec.preserve_paths = "FilesToSave", "MoreFilesToSave"
# spec.framework = "SomeFramework"
# spec.frameworks = "SomeFramework", "AnotherFramework"
# spec.library = "iconv"
# spec.libraries = "iconv", "xml2"
pec.requires_arc = true
# spec.xcconfig = { "HEADER_SEARCH_PATHS" => "$(SDKROOT)/usr/include/libxml2" }//工程配置,如果引用.a文件看報(bào)錯(cuò)情況配置
# spec.dependency "JSONKit", "~> 1.4"http://自己的私有庫(kù)中如果引用別的庫(kù)需要打開
end