CocoaPods 基礎初探

去年10月的學習筆記,更新複習一下~git


官方文檔:CocoaPods Guidesgithub

1. pod install & pod update

1.1 概念

Podfile 文件:描述工程的依賴庫,能夠理解爲是一份「標準」。
Podfile.lock 文件:記錄和追蹤已生成的 Pod 版本,裏面有以前 pod install 時使用的各個庫的版本以及依賴的第三方庫版本。能夠理解爲是一份「歷史記錄」。xcode

  • pod install:從新下載並安裝 pods ,版本號從 Podfile.lock 文件中獲取,lock 文件中有記錄則安裝記錄版本(不檢查更新),無記錄則安裝 Podfile 指定版本的 pods
  • pod update:無視 Podfile.lock 鎖定的版本號,查找並更新到知足 Podfile 中指定版本號要求範圍的最新版本 pods
    • 更新指定庫 pod update [PODNAME],若無 PODNAME 則默認更新 Podfile 中所有 Pods

擴展學習:iOS裏的動態庫和靜態庫緩存

1.2 pod install 內部邏輯

class Install < Command
  include Project
  # ...
  def run
    verify_podfile_exists!
    run_install_with_update(false)
  end
end
複製代碼
#初始化 Installer 對象
def run_install_with_update(update)
  installer = Installer.new(config.sandbox, config.podfile, config.lockfile)
  installer.update = update
  installer.install!
end
複製代碼
#install 方法
def install!
  prepare                              // 1.準備工做
  resolve_dependencies                 // 2.解決依賴衝突
  download_dependencies                // 3.下載依賴文件
  determine_dependency_product_types   // 4.決定依賴庫的類型
  verify_no_duplicate_framework_names  // 5.驗證沒有重名的framework
  verify_no_static_framework_transitive_dependencies // 6.驗證靜態庫的傳遞依賴
  verify_framework_usage               // 7.驗證framework的使用
  generate_pods_project                // 8.生成工程
  integrate_user_project               // 9.整合用戶項目
  perform_post_install_actions         // 10.執行 install 後的行爲
end
複製代碼
  1. 準備工做:prepare
    • 準備沙盒:一些文件以及目錄的刪除以及建立
    • 遷移沙盒中部分文件(區分Pods版本遷移地址不一樣)
    • 執行 pre_install 的 Hook 函數
  2. 解決依賴衝突:resolve_dependencies
    • 啓動 hooks 並建立一個 analyzer
    • 使用 analyzer 更新本地 specs 庫、處理版本依賴 (若是設置了 —no-repo-update,就不更新本地索引庫)
  3. 下載依賴文件:download_dependencies
def download_dependencies
  UI.section 'Downloading dependencies' do
    create_file_accessors         // 3.1 準備沙盒文件訪問器
    install_pod_sources           // 3.2 下載安裝Pods依賴庫源文件
    run_podfile_pre_install_hooks // 3.3 執行Pods依賴庫的pre_install的Hook函數
    clean_pod_sources             // 3.4 根據Config和Installers參數清理Pods的源文件
  end
end
複製代碼
  1. 決定依賴庫的類型:determine_dependency_product_types
  2. 驗證沒有重名的 framework:verify_no_duplicate_framework_names
  3. 驗證靜態庫的傳遞依賴:verify_no_static_framework_transitive_dependencies 檢查靜態庫裏是否包含了引用的靜態庫, 造成傳遞依賴。靜態庫的傳遞依賴若是造成會主動拋出 transitive dependencies that include static binaries 異常。
  4. 驗證 framework 的使用:verify_framework_usage
  5. 生成工程:generate_pods_project
def generate_pods_project
  UI.section 'Generating Pods project' do
    prepare_pods_project           // 8.1 準備Pods工程
    install_file_references        // 8.2 安裝文件引用
    install_libraries              // 8.3 安裝庫
    set_target_dependencies        // 8.4 爲Target設置依賴
    run_podfile_post_install_hooks // 8.5 執行Podfile的post_install代碼塊
    write_pod_project              // 8.6 執行Project類的Save方法保存配置
    share_development_pod_schemes  // 8.7 共享依賴庫的Target Scheme
    write_lockfiles                // 8.8 修改Pods工程的LockFile文件
  end
複製代碼
  1. 整合用戶項目:integrate_user_project
    • 負責建立 xcode 的 workspace, 並整合全部的 target 到新的 workspace 中.
    • 拋出 Podfile 空項目依賴和 xcconfig 是否被原有的 xcconfig 所覆蓋依賴相關的警告。
  2. 執行 install 後的行爲:perform_post_install_actions
    • Pods 庫下的文件以便執行 post_install 的 Hook 函數
    • 執行 post_install 的 Hook 函數
    • 拋出簽名執行收集的 Spec 廢棄警告
    • 從新鎖定 Lock Pods 庫下的文件防止用戶誤修改

pod 源碼:GitHub - CocoaPods/CocoaPods: The Cocoa Dependency Manager.
源碼探究方法參考:pod install和pod update背後那點事 | Startry Blogruby

1.3 install & update 的使用

  • 工程首次執行 pod 命令時,install 和 update 效果一致
  • 安裝新 pod 時,使用 pod install 或 pod update [NEW_POD],能夠只對新 pod 操做而不更新其餘 pods,防止更新其餘 pods 可能引發的適配問題。
  • 更新 pod 版本時,根據只需更新一個 pod /需更新所有 pods 來使用pod update [PODNAME]/pod update,使用 pod update 應慎重。

經常使用參數ide

  • --no-repo-update:不更新本地索引庫
  • --verbose 和 --silent:顯示所有操做信息/不顯示信息

2. pod cache

  • pod cache list [NAME]:列出本地 pods 緩存記錄
  • pod cache clean [NAME]:刪除本地 pods 緩存記錄

緩存地址:~/Library/Caches/CocoaPods/函數

3. podspec 公有庫發佈

3.1 建立項目

  • 使用項目模版建立項目: pod lib create 'xxxxxx'
  • 直接使用本身的項目:使用 pod spec create 'xxxxxx' 給項目添加 Podspec 文件

3.2 驗證代碼和 Podspec 文件是否有問題

pod lib lint xxxxxx.podspecpost

  • --verbose:輸出全部的消息信息
  • --allow-warnings:屏蔽警告
  • --fail-fast:出現第一個錯誤的時候就中止
  • --sources:若是一個庫的 podspec 包含了除 Cocoapods 倉庫之外的其餘庫的引用,則須要該參數指明,用逗號分隔

3.3 打 tag

3.4 上傳到 Cocoapods 官方倉庫

pod trunk push xxxxxx.podspec 查詢是否上傳成功:pod search xxxxxx 加入其餘開發者:pod trunk add-owner 'xxxxxx' '郵箱'學習

推薦閱讀: CocoaPods 結構詳解:我所理解的 CocoaPods ui

相關文章
相關標籤/搜索