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

39
做自己的可可豆夾 Objective-C 套件管理系統 cocoaheads.tw 2014 @Superbil

description

Make a private cocoapod repo

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

Page 1: 做自己的可可豆夾 @ cocoahead.tw

做自己的可可豆夾 Objective-C 套件管理系統

cocoaheads.tw 2014 @Superbil

Page 2: 做自己的可可豆夾 @ cocoahead.tw

About me

• 軟體工工程師、iOS 開發

• Git / Emacs

• about.me/superbil

• freenode #emacs.tw #g0v.tw #python.tw

Page 3: 做自己的可可豆夾 @ cocoahead.tw

目錄• 什麼是 cocoapods

• 建立一個 podspec

• 建立屬於自己的私人 repo

• 編寫 podspec 的注意事項

• Podspec 裡面的奇技淫巧

Page 4: 做自己的可可豆夾 @ cocoahead.tw

什麼是 cocoapods

• 語意化版本 (Semantic Versioning) 套件管理系統

• 快速(偷懶)使用第三方元件

• 解決套件之間的相依性問題

Page 5: 做自己的可可豆夾 @ cocoahead.tw

為什麼要用 cocoapods• 語意化版本 (Semantic Versioning) 套件管理系統

• 多人協作的時候,知道該不該升級元件

• 快速(偷懶)使用第三方元件

• pod search <Make_a_wish>

• 解決套件之間的相依性問題

• duplicate symbols

Page 6: 做自己的可可豆夾 @ cocoahead.tw

使用 cocoapods

• gem install cocoapods

• 建議先裝 homebrew,再裝ruby

• pod setup

• 安裝完,設定 cocoapods 環境

Page 7: 做自己的可可豆夾 @ cocoahead.tw

使用 cocoapods (2)

• pod init

• 在當前目錄下面尋找 xcode project ,並建立一個 Podfile

• pod install

• 依照 Podfile 中的需求,安裝到 xcode project

Page 8: 做自己的可可豆夾 @ cocoahead.tw

使用 cocoapods (3)

• platform :ios, '5.1'

• xcodeproj `MyProject.xcodeproj`

• pod 'JSONKit', '~> 1.4'

• pod 'Reachability', '~> 3.0.0'

Page 9: 做自己的可可豆夾 @ cocoahead.tw

更新 Pod

• pod

• 依照目前(Podfile.lock)的 Pod 更新

• pod update

• 更新 Podfile 中的 Pods

Page 10: 做自己的可可豆夾 @ cocoahead.tw

建立一個 podspec

• podspec 表示一個單位

• pod spec create <NAME>

• 只建立 podspec 檔,其他流程都要動手做

Page 11: 做自己的可可豆夾 @ cocoahead.tw

podspec Example

Page 12: 做自己的可可豆夾 @ cocoahead.tw

自己做 Pod 流程• 建立 pod spec create <NAME>

• 增加 source code, example

• 上傳 source code 並加上 git tag

• 編寫 <NAME>.podspec

• 驗證 pod spec lint <NAME>.podspec

• 上傳 pod push origin <NAME>.podspec

Page 13: 做自己的可可豆夾 @ cocoahead.tw

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

這是一個需要耐心的過程

Page 14: 做自己的可可豆夾 @ cocoahead.tw

pod lib create• 使用 pod lib create <NAME>

• clone_template

• git clone pod-template <NAME>

• configure_template

• ruby! "_CONFIGURE.rb <NAME>

Page 15: 做自己的可可豆夾 @ cocoahead.tw

pod-template• Assets

• CHANGELOG.md

• Classes

• ios

• osx

• LICENSE

• NAME.podspec

• POD_README.md

• Project

• Podfile

• README.md

• Rakefile

• _CONFIGURE.rb

Page 16: 做自己的可可豆夾 @ cocoahead.tw

pod lib 開發流程

• pod lib create <NAME>

• add source code and edit <NAME>.podspec

• pod lib lint

• pod push origin <NAME>.podspec

Page 17: 做自己的可可豆夾 @ cocoahead.tw

建立自己的可可豆夾

Page 18: 做自己的可可豆夾 @ cocoahead.tw

pod repo 結構

• $HOME/repos/master/ps_name/version/ps_name.podspec

• repo 使用 git 做管理

Page 19: 做自己的可可豆夾 @ cocoahead.tw

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`.

Page 20: 做自己的可可豆夾 @ cocoahead.tw

編寫 Podspec 的注意事項

Page 21: 做自己的可可豆夾 @ cocoahead.tw

語意化版本 (1)• pod 'JSONKit', '~> 1.4'

• 可以使用不同的限制條件

• 會自動安裝 1.x 版的升級

• pod 'JSONKit', '~> 1.4.1'

• 自動升級只到 1.4.x

Page 22: 做自己的可可豆夾 @ cocoahead.tw

語意化版本 (2)

• 主版號.次版號.修訂號

• 主版號:當你做了不相容的 API 修改

• 次版號:當你做了向下相容的功能性新增

• 修訂號:當你做了向下相容的問題修正

Page 23: 做自己的可可豆夾 @ cocoahead.tw

pod lint 錯誤 (1)

• WARN | Git sources should specify a tag

• podspec 的 source 必需指到一個 tag

Page 24: 做自己的可可豆夾 @ cocoahead.tw

pod lint 錯誤 (2)

• WARN | The summary should end with proper punctuation.

• summary 少了句號。

Page 25: 做自己的可可豆夾 @ cocoahead.tw

pod lint 錯誤 (3)

• pod lib lint 的檢查和 pod push origin <NAME>.podpsec 範圍不同

• 雖然 pod lib lint 雖然可以過,但是上傳的時候才會出現錯誤

Page 26: 做自己的可可豆夾 @ cocoahead.tw

先別說cocoapods 你知道相依性嗎?

Page 27: 做自己的可可豆夾 @ cocoahead.tw

相依性處理• 盡可以把沒有相依性的元件先整理出來

• 先把影嚮最小的做成一個 pod

• subspec 裡面可以做一些簡單的相依性處理

• 用 Category 去處理相依性

Page 28: 做自己的可可豆夾 @ cocoahead.tw

Podspec 裡面的奇技淫巧

Page 29: 做自己的可可豆夾 @ cocoahead.tw

spec.xcconfig• s.xcconfig = { 'HEADER_SEARCH_PATHS' => '"$

(SDKROOT)/usr/include/libxml2"' }

• 在 Target 的 project 的 HEADER_SEARCH_PATHS 加上參數

• HEADER_SEARCH_PATHS 為 MyProject.pbxproj 中的值,非介面上顯示的

Page 30: 做自己的可可豆夾 @ cocoahead.tw

spec.xcconfig

• s.xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }

• 手動加入 -ObjC 的 flags

Page 31: 做自己的可可豆夾 @ cocoahead.tw

other link options

• s.libraries = 'xml2'

• 會在 other link flags 加上 -llibxml2

Page 32: 做自己的可可豆夾 @ cocoahead.tw

spec.compiler_flags

• s.compiler_flags = '-DGDATA_IPHONE=1', '-DGTM_INCLUDE_OAUTH2=1'

• 在 target project 中 compiler flags 加入自定義的參數

Page 33: 做自己的可可豆夾 @ cocoahead.tw

subspec

• pod 'MyPodspec/Common'

• 只要安裝這個 subspec 的方式

Page 34: 做自己的可可豆夾 @ cocoahead.tw

spec.default

• pod 'MyPodspec'

• 預設會安裝的東西,會先安裝 spec 下的再跑 default_subspec 的東西

Page 35: 做自己的可可豆夾 @ cocoahead.tw

resource 的相依性

• Pods-Target-resources.sh

• 把 resource 複製到 Project 上

• 使用 subspec 來整理 resource

• spec.resource_bundles

Page 36: 做自己的可可豆夾 @ cocoahead.tw

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

Page 37: 做自己的可可豆夾 @ cocoahead.tw

s.version 相容

• GData 已經有新版本,但是最新的程式碼在 trunk 上

• 建立特別的版號,然後把 podspec 放在自己的 repo 中

• pod 'GData', '~> 0.0.1-pp'

Page 38: 做自己的可可豆夾 @ cocoahead.tw

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" {} +

Page 39: 做自己的可可豆夾 @ cocoahead.tw

Ref

• http://cocoapods.org/

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

• https://github.com/CocoaPods/CocoaPods

• https://github.com/CocoaPods/pod-template