Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
做自己的可可豆夾
Objective-C 套件管理系統
cocoaheads.tw 2014
@Superbil
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...
使用 cocoapods
•

gem install cocoapods
•

•

建議先裝 homebrew,再裝ruby

pod setup
•

安裝完,設定 cocoapods 環境
使用 cocoapods (2)
•

pod init
•

在當前目錄下面尋找 xcode project ,

並建立一個 Podfile

•

pod install
•

依照 Podfile 中的需求,安裝到 xcode projec...
使用 cocoapods (3)
•

platform :ios, '5.1'

•

xcodeproj `MyProject.xcodeproj`

•

pod 'JSONKit',

•

pod 'Reachability', '~...
更新 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

...
每一個 podspec 都要
樣做一次...

是一個需要耐心的過程
pod lib create
•

使用 pod lib create <NAME>
•

clone_template
•

•

git clone pod-template <NAME>

configure_template
•

rub...
pod-template
•
•

Assets
CHANGELOG.md

•

NAME.podspec

•

POD_README.md

•

•

Project

Classes

•

•
•
•

ios
osx

LICEN...
pod lib 開發流程
•

pod lib create <NAME>

•

add source code and edit <NAME>.podspec

•

pod lib lint

•

pod push origin <NA...
建立自己的可可豆夾
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/`....
編寫 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 的
HEADE...
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 =...
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 !

TEXT

end

•

fi...
Ref
•

http://cocoapods.org/

•

http://guides.cocoapods.org/syntax/podspec.html

•

https://github.com/CocoaPods/CocoaPod...
Upcoming SlideShare
Loading in …5
×

做自己的可可豆夾 @ cocoahead.tw

2,153 views

Published on

Make a private cocoapod repo

Published in: Technology
  • Be the first to comment

做自己的可可豆夾 @ cocoahead.tw

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

×