Pods 到底需不需要放在 .gitignore?

若有使用 GitHub 所預設的 Swift .gitignore,你會發現在 CocoaPods 的部分寫著

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

用意如同字面上的意思,GitHub 所提供的預設會建議你上傳 Pods 的內容到 git server 上,

而我個人也認同這種做法,目前所想的原因如下:

  • 可以完整地打包套件當前狀態到 git 上,以避免套件有異動
  • 若你們有直接修改 Pods 裡頭的 Source code 的話,更加得上傳(不過完全不建議這麼做)
  • git clone 下來之後可以不用再 pod install 一次

不過也是有些壞處,如套件越多時,造成 git 上的專案肥大等。

但是像是 Carthage 的話,就會建議加入到 .gitignore,畢竟它的用意就是要去中心化,

若將自己 build 出來的套件放上去就和中心概念背道而馳了!

CocoaPods

CocoaPods

上一篇介紹 Carthage,這篇寫一下 CocoaPods。

其實我個人是先使用 CocoaPods,後來才部分改用 Carthage 作為主要的管理方式;
而 CocoaPods 的安裝方式也很簡單,可以透過 gem 來安裝:

安裝

sudo gem install cocoapods

不同於 Carthage 的 Cartfile,CocoaPods 的是使用 Podfile
格式有些不同,不過都可以在資料夾下使用 Terminal 輸入初始化的指令:

pod init

系統就會自行建立一個 Podfile,並用 pod search 的指令來找找你要什麼東西。

弄完 Podfile 之後,就可以執行安裝進專案:

pod install

並打開它幫你建立的 .xcworkspace 就好了。

一些分享

  • 可安裝的版本和 GitHub 上寫的不同?

CocoaPods 會建立一個 local 的所有 repo 資訊,若找不到的時候,可以先試著更新它:

pod repo update
  • Carthage 和 CocoaPods 是可以混用的

Carthage

Carthage

Carthage 是一個套件管理的開源軟體,可以使用 Homebrew 安裝:

brew install carthage

和 CocoaPods 的差異在於它並不會將第三方的 Framework 直接加入專案,
而是獨立在外,並在 build 的時候直接將 framework 複製進去到 App 內;

CocoaPods 的話則會在每次 build 的時候同時 build 你所匯入的 framework,
而隨著專案使用到的套件內容越多,則會花越多時間。

去中心化

這個詞最近隨著區塊鏈的爆紅,也常常可以看見。

不過在這邊的情境是,CocoaPods 是由它那邊搜集很多個 repo,提供給我們來安裝;
所以若 CocoaPods 的 repo 資料沒更新,或是作者只放在 GitHub 上,沒有提交到 CocoaPods 的話,
則無法使用。

而 Carthage 則沒有這方面的問題,可以自行將 GitHub 上的專案加入到 Cartfile

github "ReactiveX/RxSwift"

不過這也是比較麻煩的地方,我們就沒有辦法像 CocoaPods 一樣直接在 Terminal 下 pods search RxSwift 來取得資訊。

個人的使用方式

由於我自行在開發,同時會有很多個專案用到相同的 framework(e.g RxSwift、Siren),
原本若是使用 CocoaPods 的話,則會在很多資料夾內都有一樣的東西;
而 Carthage 的話,則是將 FRAMEWORK_SEARCH_PATHS 都指定到同一個資料夾即可,
並在 Build phase 加上 Carthage 的 Run script。

而我大多數只會開發 iOS 的 App,Carthage update 的時候則可以只更新 iOS 的部分:

carthage update --platform iOS