做自己的可可豆夾 @ cocoahead.tw
-
Upload
kai-yuan-cheng -
Category
Technology
-
view
1.435 -
download
1
description
Transcript of 做自己的可可豆夾 @ cocoahead.tw
About me
• 軟體工工程師、iOS 開發
• Git / Emacs
• about.me/superbil
• freenode #emacs.tw #g0v.tw #python.tw
目錄• 什麼是 cocoapods
• 建立一個 podspec
• 建立屬於自己的私人 repo
• 編寫 podspec 的注意事項
• Podspec 裡面的奇技淫巧
什麼是 cocoapods
• 語意化版本 (Semantic Versioning) 套件管理系統
• 快速(偷懶)使用第三方元件
• 解決套件之間的相依性問題
為什麼要用 cocoapods• 語意化版本 (Semantic Versioning) 套件管理系統
• 多人協作的時候,知道該不該升級元件
• 快速(偷懶)使用第三方元件
• pod search <Make_a_wish>
• 解決套件之間的相依性問題
• duplicate symbols
使用 cocoapods
• gem install cocoapods
• 建議先裝 homebrew,再裝ruby
• pod setup
• 安裝完,設定 cocoapods 環境
使用 cocoapods (2)
• pod init
• 在當前目錄下面尋找 xcode project ,並建立一個 Podfile
• pod install
• 依照 Podfile 中的需求,安裝到 xcode project
使用 cocoapods (3)
• platform :ios, '5.1'
• xcodeproj `MyProject.xcodeproj`
• pod 'JSONKit', '~> 1.4'
• pod 'Reachability', '~> 3.0.0'
更新 Pod
• pod
• 依照目前(Podfile.lock)的 Pod 更新
• pod update
• 更新 Podfile 中的 Pods
建立一個 podspec
• podspec 表示一個單位
• pod spec create <NAME>
• 只建立 podspec 檔,其他流程都要動手做
podspec Example
自己做 Pod 流程• 建立 pod spec create <NAME>
• 增加 source code, example
• 上傳 source code 並加上 git tag
• 編寫 <NAME>.podspec
• 驗證 pod spec lint <NAME>.podspec
• 上傳 pod push origin <NAME>.podspec
每一個 podspec 都要這樣做一次...
這是一個需要耐心的過程
pod lib create• 使用 pod lib create <NAME>
• clone_template
• git clone pod-template <NAME>
• configure_template
• ruby! "_CONFIGURE.rb <NAME>
pod-template• Assets
• CHANGELOG.md
• Classes
• ios
• osx
• LICENSE
• NAME.podspec
• POD_README.md
• Project
• Podfile
• README.md
• Rakefile
• _CONFIGURE.rb
pod lib 開發流程
• pod lib create <NAME>
• add source code and edit <NAME>.podspec
• pod lib lint
• pod push origin <NAME>.podspec
建立自己的可可豆夾
pod repo 結構
• $HOME/repos/master/ps_name/version/ps_name.podspec
• repo 使用 git 做管理
pod repo add
• pod repo add NAME URL [BRANCH]
• Clones `URL` in the local spec-repos directory at `~/.cocoapods/repos/`. The
• remote can later be referred to by `NAME`.
編寫 Podspec 的注意事項
語意化版本 (1)• pod 'JSONKit', '~> 1.4'
• 可以使用不同的限制條件
• 會自動安裝 1.x 版的升級
• pod 'JSONKit', '~> 1.4.1'
• 自動升級只到 1.4.x
語意化版本 (2)
• 主版號.次版號.修訂號
• 主版號:當你做了不相容的 API 修改
• 次版號:當你做了向下相容的功能性新增
• 修訂號:當你做了向下相容的問題修正
pod lint 錯誤 (1)
• WARN | Git sources should specify a tag
• podspec 的 source 必需指到一個 tag
pod lint 錯誤 (2)
• WARN | The summary should end with proper punctuation.
• summary 少了句號。
pod lint 錯誤 (3)
• pod lib lint 的檢查和 pod push origin <NAME>.podpsec 範圍不同
• 雖然 pod lib lint 雖然可以過,但是上傳的時候才會出現錯誤
先別說cocoapods 你知道相依性嗎?
相依性處理• 盡可以把沒有相依性的元件先整理出來
• 先把影嚮最小的做成一個 pod
• subspec 裡面可以做一些簡單的相依性處理
• 用 Category 去處理相依性
Podspec 裡面的奇技淫巧
spec.xcconfig• s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$
(SDKROOT)/usr/include/libxml2"' }
• 在 Target 的 project 的 HEADER_SEARCH_PATHS 加上參數
• HEADER_SEARCH_PATHS 為 MyProject.pbxproj 中的值,非介面上顯示的
spec.xcconfig
• s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
• 手動加入 -ObjC 的 flags
other link options
• s.libraries = 'xml2'
• 會在 other link flags 加上 -llibxml2
spec.compiler_flags
• s.compiler_flags = '-DGDATA_IPHONE=1', '-DGTM_INCLUDE_OAUTH2=1'
• 在 target project 中 compiler flags 加入自定義的參數
subspec
• pod 'MyPodspec/Common'
• 只要安裝這個 subspec 的方式
spec.default
• pod 'MyPodspec'
• 預設會安裝的東西,會先安裝 spec 下的再跑 default_subspec 的東西
resource 的相依性
• Pods-Target-resources.sh
• 把 resource 複製到 Project 上
• 使用 subspec 來整理 resource
• spec.resource_bundles
spec.source• spec.version 若是 0.0.1
• 使用 0.0.1, 使用這個 version, source 可以使用 :commit => "ABCDEFG.yooooooo"
• s.source = { :git => 'git://repo.git', :commit => 'git_commit_hash'}
http://guides.cocoapods.org/syntax/podspec.html#source
s.version 相容
• GData 已經有新版本,但是最新的程式碼在 trunk 上
• 建立特別的版號,然後把 podspec 放在自己的 repo 中
• pod 'GData', '~> 0.0.1-pp'
spec.post_install• 在元件安裝完之後,要做一些髒事情時
• def s.post_install(target) puts <<-TEXT // mom, I am here ! TEXTend
• find ~/.cocoapods/repos/ -type f -exec grep -nH -e "post_install" {} +
Ref
• http://cocoapods.org/
• http://guides.cocoapods.org/syntax/podspec.html
• https://github.com/CocoaPods/CocoaPods
• https://github.com/CocoaPods/pod-template