看懂Podfile.lock

一人我程式設計累發表於2019-09-19

當前環境: Xcode10.0 Swift4.2 iOS SDK 12.1

前言

其實本來已經不想介紹這個檔案了,其實有些經驗的同學肯定對這個都非常理解,畢竟在多人開發中,它尤為有用,比如我們公司專案要有30多個人來維護,每幾個人分成一個業務組,每個迭代,每個業務組派出一個人向主分支提交程式碼,如果我們沒有很強的版本意識和Git使用技巧,很容易出現事故。

理解Podfile.lock檔案

開啟Podfile.lock檔案你會發現如下的幾個Key,我來解釋下分別是什麼意思。

  1. PODS:

    1. 例如: 下面是一部分內容 意思是: 你的AFNetworking引用的是3.1.0的版本,這個是你應用實際應用的版本,這裡要注意的是,Podfile裡面的版本區間,執行pod installpod 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)
      複製程式碼
  2. DEPENDENCIES:

    1. 這個Key下面的其實就是你Podfile裡面引用的版本,你可以清楚的看到 他們的版本區間,因為後面會有 = < > 比較符號標記,這是因為 它和 Podfile裡面引用版本的方式有關,具體可以看Podfile引用版本的細節,可以設定一個版本區間,可以定死版本。
  3. SPEC REPOS:

    1. 這個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
      複製程式碼
  4. EXTERNAL SOURCES:

    1. 在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。 比如你現在要確定你的 AutopartsStoreLibDebug 具體版本程式碼從哪裡來,那麼你就應該看下面的資訊來找到具體下載你本地的庫的版本 它是從哪裡來的。

    ```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
    ```
複製程式碼
  1. SPEC CHECKSUMS:
    1. 這個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
      複製程式碼
  2. PODFILE CHECKSUM:
    1. 這個欄位就是對Podfile檔案的SHA1的值。用來對比Podfile是否有過改變。

最後

上面我對Podfile.lock檔案每個欄位都介紹了一下,其實它最主要的功能就是告訴你,你當前的app使用的三方庫的版本,來源,和他們生成的hash值,用在多人協作中,來確定版本是否被更改等等。 因為這份檔案才是 你真正在app當中的三方庫版本,而不是Podfile檔案裡面寫的。 Podfile更像是一個版本約束,而Podfile.lock才是你真正使用的版本。 如果讓你去確定你app使用某一個三方庫的版本,你不應該找Podfile,而是應該找Podfile.lock檔案。 即使你Podfile使用的定死版本的方式。

補充

  1. 本地源版本管理地址: 例如:/Users/yongpeng.zhu/.cocoapods/repos/
    1. 存放著各個源的版本,對應的Podspec檔案
  2. 本地源快取地址: 例如:/Users/yongpeng.zhu/Library/Caches/CocoaPods/Pods
    1. 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欄位就知道了。
    2. Release資料夾: 上傳到源上面版本的Pod原始碼
    3. Specs資料夾: 存放這些外部的或者釋出在源傷的Podspec檔案的JSON檔案,這個JSON檔案其實就是把Podspec檔案解析然後組成的。
    4. VERSION檔案:存放著當前的cocoapods版本

上面兩個地址,第一個是記錄 釋出到源上面的版本,和Podspec檔案,第二個是記錄 快取,內容包括 原始碼 和 Podspec 配置檔案 和 Cocoapods版本。

相關文章