當前環境: Xcode10.0 Swift4.2 iOS SDK 12.1
前言
其實本來已經不想介紹這個檔案了,其實有些經驗的同學肯定對這個都非常理解,畢竟在多人開發中,它尤為有用,比如我們公司專案要有30多個人來維護,每幾個人分成一個業務組,每個迭代,每個業務組派出一個人向主分支提交程式碼,如果我們沒有很強的版本意識和Git使用技巧,很容易出現事故。
理解Podfile.lock檔案
開啟Podfile.lock檔案你會發現如下的幾個Key,我來解釋下分別是什麼意思。
-
PODS
:- 例如: 下面是一部分內容 意思是: 你的AFNetworking引用的是3.1.0的版本,這個是你應用實際應用的版本,這裡要注意的是,Podfile裡面的版本區間,執行
pod install
和pod update
區別,install 不會更新區間版本,update則會更新到可升區間的最大版本。 尤其在多人開發的大專案有之中,如果Podfile裡面沒有鎖死版本,很容易造成版本被動升級。// AFNetworking 是被安裝的是3.1.0版本,這是在你的源下面搜到的podspec檔案下的版本號,並且包括依賴AFNetworking的依賴。 PODS: - AFNetworking (3.1.0): - AFNetworking/NSURLSession (= 3.1.0) - AFNetworking/Reachability (= 3.1.0) - AFNetworking/Security (= 3.1.0) - AFNetworking/Serialization (= 3.1.0) - AFNetworking/UIKit (= 3.1.0) 複製程式碼
- 例如: 下面是一部分內容 意思是: 你的AFNetworking引用的是3.1.0的版本,這個是你應用實際應用的版本,這裡要注意的是,Podfile裡面的版本區間,執行
-
DEPENDENCIES
:- 這個Key下面的其實就是你Podfile裡面引用的版本,你可以清楚的看到 他們的版本區間,因為後面會有 = < > 比較符號標記,這是因為 它和 Podfile裡面引用版本的方式有關,具體可以看Podfile引用版本的細節,可以設定一個版本區間,可以定死版本。
-
SPEC REPOS
:- 這個Key是表示 你這個專案有用到源有哪些,有些私有源,有些公有源,例如 預設的 Github cocoapods的源,私有源就是這個源實在私人伺服器上並且不對外開放,公有源就是你這個源可以對任何人開發,對不對外開放這個取決於你的源放在哪裡,例如我下面的私有源是在公司內部的gitlab中搭建的,對於外面的人來說肯定就是私有源,因為他們不能訪問到我公司的git源。
SPEC REPOS: "git@git.nevint.com:DOMOBILE-FeiDian/DOMOBILE-FeiDian-FDSpec.git": //私有源 - Alita "git@git.nevint.com:ios/nio-lib-repo.git": //私有源 - CCUtil https://github.com/cocoapods/specs.git: // 公有源 - AFNetworking - Aspects - Bugly - CocoaSecurity - DBPrivacyHelper 複製程式碼
- 這個Key是表示 你這個專案有用到源有哪些,有些私有源,有些公有源,例如 預設的 Github cocoapods的源,私有源就是這個源實在私人伺服器上並且不對外開放,公有源就是你這個源可以對任何人開發,對不對外開放這個取決於你的源放在哪裡,例如我下面的私有源是在公司內部的gitlab中搭建的,對於外面的人來說肯定就是私有源,因為他們不能訪問到我公司的git源。
-
EXTERNAL SOURCES
:-
在Podfile引用的版本使用的git的引用,沒有上傳到源的這種引用,會被放在 external sources 。 例如: pod 'RNShop', :git => 'git@git.nevint.com:DOMOBILE-FeiDian/do-otd-mer-nioapp-ios.git', :tag => '0.4.1' 像這種引用,它明確了使用哪個git但是,這個pod並沒有上傳到私有源版本,所以他會在 外部源裡面。 如何釋出到私有源 或者 公有源 可以去Cocoapods文件自行查詢。
EXTERNAL SOURCES: AutopartsStoreLib: :git: "git@git.nevint.com:DOMOBILE-FeiDian/DOIOS-Nioapp-AutopartsStore-Maintenance.git" :tag: 0.6.29 CodePush: :path: "../../do-otd-mer-nioapp-rn/node_modules/react-native-code-push" Debug: :git: "git@git.nevint.com:DOMOBILE-FeiDian/DOIOS-Nioapp-Debug.git" :tag: 1.11.8 DeepLinkKit: :git: "git@git.nevint.com:ios/DeepLinkKit.git" :tag: 1.2.2.1 libwebp: :git: "git@git.nevint.com:ios-libs/libwebp.git" :tag: v0.6.0 複製程式碼
-
5. CHECKOUT OPTIONS:
:
1. 這個欄位,其實是對應 當有些pod庫沒有在源(公有源/私有源)當中 PS: 比如你在Podfile裡面引入版本用的是tag或者commit,下面的內容是 是真正裝在你app當中的三方庫程式碼,從哪個git,哪個tag,哪個commit。 比如你現在要確定你的 AutopartsStoreLib
,Debug
具體版本程式碼從哪裡來,那麼你就應該看下面的資訊來找到具體下載你本地的庫的版本 它是從哪裡來的。
```yaml
CHECKOUT OPTIONS:
AutopartsStoreLib:
:git: "git@git.nevint.com:DOMOBILE-FeiDian/DOIOS-Nioapp-AutopartsStore-Maintenance.git"
:tag: 0.6.29
Debug:
:git: "git@git.nevint.com:DOMOBILE-FeiDian/DOIOS-Nioapp-Debug.git"
:tag: 1.11.8
DeepLinkKit:
:git: "git@git.nevint.com:ios/DeepLinkKit.git"
:tag: 1.2.2.1
libwebp:
:git: "git@git.nevint.com:ios-libs/libwebp.git"
:tag: v0.6.0
```
複製程式碼
SPEC CHECKSUMS
:- 這個hash值怎麼來的呢,我來解釋一下,例如:
Alita: 577f02fd587c7722d9c063c70a278a0ef6f35ef9
,那麼這個hash值是對 我們本地/Users/yongpeng.zhu/.cocoapods/repos/nevint-domobile-feidian-fdspec/Alita/0.2.1/Alita.podspec
這個檔案的SHA1的值來保證,你的podspec檔案是一致的。 如果這個地方發生了改變,那麼只可能是你的podspec檔案發生了改變。SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 Alita: 577f02fd587c7722d9c063c70a278a0ef6f35ef9 Aspects: 7595ba96a6727a58ebcbfc954497fc5d2fdde546 AutopartsStoreLib: 4663847a6d03364760affc5b4cefda84e1d6d214 Bugly: 3ca9f255c01025582df26f9222893b383c7e4b4e CCUtil: 5c83684e2e5e514fe20a16de0c95a250faf2cf75 複製程式碼
- 這個hash值怎麼來的呢,我來解釋一下,例如:
PODFILE CHECKSUM
:- 這個欄位就是對Podfile檔案的SHA1的值。用來對比Podfile是否有過改變。
最後
上面我對Podfile.lock
檔案每個欄位都介紹了一下,其實它最主要的功能就是告訴你,你當前的app使用的三方庫的版本,來源,和他們生成的hash值,用在多人協作中,來確定版本是否被更改等等。 因為這份檔案才是 你真正在app當中的三方庫版本,而不是Podfile檔案裡面寫的。 Podfile
更像是一個版本約束,而Podfile.lock才是你真正使用的版本。 如果讓你去確定你app使用某一個三方庫的版本,你不應該找Podfile,而是應該找Podfile.lock檔案。 即使你Podfile使用的定死版本的方式。
補充
- 本地源版本管理地址: 例如:
/Users/yongpeng.zhu/.cocoapods/repos/
- 存放著各個源的版本,對應的
Podspec
檔案
- 存放著各個源的版本,對應的
- 本地源快取地址: 例如:
/Users/yongpeng.zhu/Library/Caches/CocoaPods/Pods
- External資料夾: 存放外部源的程式碼,例如,你引用的Pod模組是直接用 Commit/Tag 去引用的,它並沒有上傳到源上,
pod 'ABCKit', :git => 'git@git.nevint.com:ios-libs/ABCKit.git', :commit => '76a7c550c98030e606477f4506d1060846253b3b'
或者pod 'libwebp', :git => 'git@git.nevint.com:ios-libs/libwebp.git', :tag => 'v0.6.0'
像這種引用方式 其實這個Pod並沒有上傳到源上,而是直接從git上拉的,所以算作外部源上面,你可以參考上面Podfile.lock
檔案裡面的External
欄位就知道了。 - Release資料夾: 上傳到源上面版本的Pod原始碼
- Specs資料夾: 存放這些
外部的
或者釋出在源傷的
的Podspec
檔案的JSON
檔案,這個JSON檔案其實就是把Podspec檔案解析然後組成的。 - VERSION檔案:存放著當前的cocoapods版本
- External資料夾: 存放外部源的程式碼,例如,你引用的Pod模組是直接用 Commit/Tag 去引用的,它並沒有上傳到源上,
上面兩個地址,第一個是記錄 釋出到源上面的版本,和Podspec檔案,第二個是記錄 快取,內容包括 原始碼 和 Podspec 配置檔案 和 Cocoapods版本。