CocoaPods 使用小結

部分參考了使用 CocoaPods 打包html

1 工具安裝

//安裝
sudo gem install cocoapods-packager

//更新
sudo gem update --system 
sudo gem install cocoapods 
sudo gem install cocospods-trunk
複製代碼

2 pod倉庫帳號管理

//註冊(要去郵箱裏點擊確認,流程纔算完。)
pod trunk register xxx@163.com 'Yang' --description='Yang's xhzy mac' //查看這個設備上的帳號、相關設備信息、相關倉庫信息。 pod trunk me //換臺電腦,須要登陸(註冊一個session)cocoapod倉庫. (同樣要去郵箱確認身份) //一個帳號能夠有多臺設備。 pod trunk register xxx@163.com //給pod倉庫添加owner, 至關於github上,添加開發者。 pod trunk add-owner SHWChatRobotNOUI xxx@gmail.com 複製代碼

3 建立lib項目

pod lib create [pod name]
複製代碼

3.1 podspec文件名,podspec中s.name保持一致,決定打出來的包是什麼名字

比較好的作法是,ios

項目 git項目名 工程名 podspec name
源碼 shw-voice-sdk-sourcecode SHWVoice SHWVoice
sdk shw-voice-sdk SHWVoiceSDK SHWVoiceSDK,spec文件中指定的framework是SHWVoice.framework
  1. 源碼項目:看不到SDK字樣
  2. 實際推送framework的項目:項目名帶SDK,實際framework不帶SDK

3.2 修改.gitignore以適應本身的打包狀況

上一步操做,.gitignore已經自動生成。git

4 lib包管理

4.1 校驗

不管源碼打包,framework提交,都要先校驗。github

//有靜態庫依賴時,須要加上選項 --use-libraries
pod lib lint SHWAccount.podspec --allow-warnings --use-libraries
//對於有私有庫依賴的庫,校驗時須要加上--source
pod lib lint SHWAccount.podspec --allow-warnings --use-libraries --sources="https://code.aliyun.com/xhzy-ios/frameworkplatform.git,https://github.com/CocoaPods/Specs.git"
複製代碼

4.2 打包,即源碼打包,和framework無關。若是開源,也不用打包,直接推送。

打包時注意s.version的版本號。web

  1. 若是使用本地源碼打包,不要求git倉庫有對應的tag。
  2. 若是使用git地址打包,而且spec的source中裏面寫了tag,須要打tag。
//--no-mangle,表示不把第三方源碼、framework打進去
//--exclude-deps,解決pod-numm衝突,不包含依賴的符號表
//--force,強制覆蓋以前已經生成過的二進制庫 
pod package SHWAccount.podspec --force --no-mangle --exclude-deps
//對於有私有庫依賴的庫,打包時須要加上--spec-sources
$ pod package SHWAccount.podspec --force --no-mangle --exclude-deps --spec-sources="https://code.aliyun.com/xhzy-ios/frameworkplatform.git,https://github.com/CocoaPods/Specs.git"
複製代碼

4.3 推送

4.3.1 到本身的倉庫

4.3.1.1 添加倉庫

pod repo add REPO_NAME SOURCE_URL
複製代碼

4.3.1.2 推送到倉庫

pod repo push platform XYiOSComponent.podspec
//--use-libraries 若是有.a就須要添加這個選項
複製代碼

4.3.2 推送到公網倉庫

pod trunk push xx.podspec --allow-warnings --use-libraries    //--use-libraries 若是有.a就須要添加這個選項
複製代碼

4.4 刪除已提交的版本(很差用)

pod_trunk_deletejson

pod trunk deprecate xxx
pod trunk delete xxx 0.5.8
複製代碼

4.5 其餘參數

Pod二進制化,能夠參考,但一些參數的描述和項目實際使用中不太同樣。swift

5 緩存路徑(同版本號打屢次無效

~/Library/Caches/CocoaPods/Pods/Specs/Externalxcode

#6 Podfile緩存

source 'https://github.com/CocoaPods/Specs.git'

inhibit_all_warnings!

platform :ios, "9.0"

#use_frameworks!

#能夠對多個target設置不一樣的引用
target "WorkApp" do    
  pod 'Masonry'
  pod 'AFNetworking'
end
複製代碼

use_frameworks! 把lib-Pod達成framework,而不是.a,用於swift中,oc中不要加這句,可能報錯。bash

6.1 lib項目的Podfile

source 'https://github.com/CocoaPods/Specs.git'
inhibit_all_warnings!

platform :ios, "8.0"
target 'SHWRecommendUI_Example' do
#這裏能夠改
  pod 'SHWRecommendUI', :path => '../'
  pod 'YYText'
  target 'SHWRecommendUI_Tests' do
    inherit! :search_paths
    pod 'Kiwi'
  end
end
複製代碼

6.2 新特性,加快索引速度

//Podfile
install! 'cocoapods', generate_multiple_pod_projects: true
複製代碼

以前Cocoapods把每一個依賴做爲 target 放到 Pods 項目裏,因爲 xcodeproj 編碼緣由,pod多的時候,解析的效率會急劇降低。 generate_multiple_pod_projects選項,讓每一個依賴都做爲一個單獨的項目引入,大大增長了解析速度.

系統升級後的一些問題提示 pod search 出錯 pod search 找不到 s.source源引發的問題

7 podspec

Podspec 語法

友盟的subspec

MJRefresh的podspec

NewsFeedsUISDK的podspec

FFToast的podspec

Pod::Spec.new do |s|
    s.name = 'SHWAnalyticsSDK'
    s.version = '1.2.2'
    s.summary = 'Analytics framework.'
    s.description = "巴吉度 iOS SDK 源碼"

    s.homepage = 'https://code.aliyun.com/xhzy-ios/SHWAnalytics'
    s.license = { :type => 'MIT', :file => 'LICENSE' }
    s.author = { "yangyang" => "xxx@xxx.com" }

#s.source = { :git => 'git@code.aliyun.com:xhzy-ios/ios-account-sdk.git', :tag => s.version.to_s }
    # develop source
    s.source = { :git => 'git@code.aliyun.com:xhzy-ios/ios-analytics-sdk.git'}

    s.ios.deployment_target = '9.0'
    s.source_files = 'SHWAnalyticsSDK/Classes/**/*'

    s.public_header_files = 'SHWAnalyticsSDK/Classes/Public/*.h'
    s.frameworks = 'CoreLocation','CoreTelephony','Foundation','JavaScriptCore','UIKit','WebKit', 'SystemConfiguration','CoreFoundation','Security'
    s.dependency 'UTDID', '~> 1.0.0'
end
複製代碼

7.1 打包第三方靜態庫.a 動態庫.framework, 以及subspec

Pod::Spec.new do |s|
    s.name = 'SHWAIConversation'
    s.version = '1.52.0'
    s.summary = 'xxx'
    s.homepage = 'https://code.aliyun.com/xxx'

    s.license = { :type => 'MIT', :file => 'LICENSE' }
    s.author = { 'yangyang' => 'youxiang' }
    s.ios.deployment_target = '9.0'

# s.source = { :git => 'git@code.aliyun.com:xxx.git', :tag => s.version.to_s}
    s.source = { :git => '/Users/yayang/Desktop/SHWAIConversation'}
    s.source_files = 'SHWAIConversation/Classes/**/*'
    s.public_header_files = 'SHWAIConversation/Classes/public/*.h'
    s.resources = 'SHWAIConversation/Resource/*'

    s.frameworks = 'CoreLocation', 'SystemConfiguration', 'CoreFoundation', 'JavaScriptcore', 'CoreTelephony', 'Security', 'AudioToolbox', 'CoreMotion', 'OpenGLES', 'CoreGraphics', 'AVFoundation'
    s.libraries = 'icucore'
    #第三方.a
    s.ios.vendored_library = 'SHWNLSClient/Classes/3rd/Opus/lib/libopus.a'
    
    # subspec
    s.subspec 'NlsClientSDK' do |nls|
        nls.name = 'NlsClientSDK'
        nls.frameworks = 'CoreLocation', 'SystemConfiguration', 'CoreFoundation', 'JavaScriptcore', 'CoreTelephony', 'Security', 'AudioToolbox', 'CoreMotion', 'OpenGLES', 'CoreGraphics', 'AVFoundation'
        nls.libraries = 'icucore'
        #第三方framework
        nls.ios.vendored_frameworks = 'SHWAIConversation/Frameworks/NlsClientSDK.framework'
    end

    # dependencys
    s.dependency 'Masonry', '~> 1.1.0'
end
複製代碼

7.2 使用本地源碼打包

目的:爲了提早發現問題,能夠在不提交的狀況下進行測試。 實現方式:有兩種

  1. 第一種方式,只須要在原工程上修改podspec
  2. 第二種方式,須要兩個工程,原工程不修改,另外一個工程修改podspec和Podfile 兩種方式各有利弊,總的來講,由於能夠用多桌面,可能仍是第二種稍好。
s.source = { :git => '/Users/yayang/Desktop/SHWAIConversation'}
複製代碼
source 'https://github.com/CocoaPods/Specs.git'

inhibit_all_warnings!

platform :ios, "8.0"

target 'SHWRecommendUI_Example' do
#這裏有個大坑,注意要依賴於實際源碼,而不是打包出的源碼,如/Users/yangyang/Documents/code/workspace/test6/YangTest1Resource/YangTest1Resource-0.2.6
  pod 'SHWRecommendUI', :path => '/Users/yangyang/Documents/code/workspace/test6/YangTest1Resource'

  target 'SHWRecommendUI_Tests' do
    inherit! :search_paths

    pod 'Kiwi'
  end
end
複製代碼

7.3 framework中打包bundle文件

s.resource = 'NewsFeedsUISDK/NewsFeedsUISDK.framework/Versions/A/Resources/NFUIBundle.bundle'

8 一些問題

8.1 沒法修改保存

The document could not be saved. The file doesn’t exist.

關掉Xcode,用Xcode單獨打開這個文件,修改保存關閉。

再用Xcode打開項目。This issue is gone.

8.2 空文件夾不會自動放到Xcode中

在podspec文件建立好以後pod install。

可是源碼根目錄(Class目錄下)的空文件夾,不會自動被放到Xcode中。

8.3 pod repo update + pod search 找不到/出錯

//JSON::ParserError - A JSON text must at least contain two octets!
rm ~/Library/Caches/CocoaPods/search_index.json
複製代碼

8.4 系統升級後,pod install失敗

//錯誤1 RuntimeError - [Xcodeproj] Unknown object version.
sudo gem install cocoapods --pre

//錯誤2 ERROR: While executing gem ... (Errno::EACCES)
// Permission denied @ rb_sysopen - /Library/Ruby/Gems/2.3.0/gems/xcodeproj-1.5.7/LICENSE
sudo chmod -R 777 /Library/Ruby/Gems/

//錯誤3 ERROR: While executing gem ... (Gem::FilePermissionError)
// You don't have write permissions for the /usr/bin directory. sudo gem install -n /usr/local/bin cocoapods 複製代碼

8.5 其餘問題

  1. podspec.json的source iOS使用cocoapods 安裝libwebp 0.6.0遇到Error installing libwebp
find /Users/yangyang/.cocoapods/repos/master -iname libwebp
cd /Users/yangyang/.cocoapods/repos/master/Specs/1/9/2/libwebp
cd 0.6.1
修改libwebp.podspec.json
"source": {
"git": "https://chromium.googlesource.com/webm/libwebp",
"tag": "v0.6.0"
},
將其中的"git"對應的url替換爲https://github.com/webmproject/libwebp.git
複製代碼
  1. 有些git源,只支持git@code.aliyun.com/xxx形式地址

也多是,沒有配好本地的https用戶名密碼。或阿里雲階段性抽風

相關文章
相關標籤/搜索