開發工具的版本控制 — 在專案裡綁定 CocoaPods 與 fastlane 版本

Ethan Huang
5 min readAug 3, 2017

--

iOS 開發通常會用到許多第三方工具。像是做套件管理的 CocoaPods、整 CI/CD 的 fastlane,它們都是用 Ruby 寫的。

不管是單人還是多人開發,程式碼都會做版本控制,以便於管理。那麼上述的工具能不能也做到版控呢?

比如說,在開發機器上設定好 fastlane,能否移動到新電腦時也能指定相同的工具版號?或者是,在多個團隊共用的 CI server,每個 project 用的 CocoaPods 版本可能不同,如何共存?

這些工具環境的設置是完全可以版控的,把設定檔直接放在跟 project 同一個資料夾,一起 repo 裡面就可以了。

讀者若開發 iOS,通常比較熟悉 CocoaPods,正好讓我們做個類比。CocoaPods 在管理套件的流程是在 repo 新增 Podfile,打pod install來安裝、pod update來更新套件。

如果我們要來管理 CocoaPods 跟 fastlane 的版本,則可以使用 Bundler 這個 Ruby 程式,也就是 Ruby 的套件(Gem)管理程式。流程是在 repo 新增 Gemfile,打bundle install來安裝,bundle update來更新開發工具。

然後,我們還可以用 RVM 這個工具來管理這些 Ruby 程式所使用的 Ruby 版本。這樣一來,如果有什麼特定版本的需求,就不用受限於系統所使用的 Ruby 版本。

總共有三個 level:

  • RVM:可以在一台電腦上安裝多個 Ruby 版本,透過 .ruby-version 檔
  • Bundler:管理 Ruby 套件(Gem)的版本,透過 Gemfile 以及自動產生的 Gemfile.lock
  • CocoaPods:管理 app 所用的第三方套件版本,透過 Podfile 以及自動產生的 Podfile.lock

首先,在 repo 根目錄放置以下檔案:

1..ruby-version

2.Gemfile

CocoaPods 跟 fastlane 的版本請自行指定

3. 有用 CocoaPods 就跟以往一樣放入 Podfile

4. 有用 fastlane 就跟以往一樣放入 Fastfile

5. 設定其他開發工具

而每次要設定新的開發機器時,

  1. clone 你的 project repo
  2. 安裝 RVM

\curl -sSL https://get.rvm.io | bash -s stable

3. 在 RVM 安裝指定的版本

rvm install ruby-2.3.1

以前 Fastlane 在 2.4.0 會有問題,所以我習慣用 2.3.1。

4. gem install bundle

這樣會把 Bundle 安裝起來。

5. bundle install

這會把 CocoaPods 跟 fastlane 等套件安裝在 RVM 所指定的 Ruby 版本底下。

小技巧:在 macOS Sierra 以上版本的 Finder,可以按 Cmd+Shift+句點.來切換顯示隱藏檔

之後就可以跟跟往常一樣使用 CocoaPods 或 fastlane 了。

上述都設定好以後,怎麼做到版本同步?以 CI server 為例,如果你可以在 integration 中執行pod install,當然也可以執行 bundle install 囉。

最後,有一件事情非常重要。我們 CocoaPods 執行完以後會在目錄出現 Podfile.lock 這個檔案,它裡面放置的是套件版本相依與實際安裝的版本資訊,這個檔案務必加入 repo。

同樣的道理,在開發機器執行完 bundle install 也會產生 Gemfile.lock 檔案,務必把它加入 repo。這麼一來,即使 Gemfile 沒有指定檔案,bundle 會根據已經存在的 Gemfile.lock 來安裝。

這裡還有一些方法能增加你的認知:

  • 在 project 目錄,透過 which rubywhich bundlewhich podwhich fastlane 等指令,觀察一下所使用的程式是在哪裡。如果在沒有設定過 .ruby-version 跟 Gemfile 的目錄輸入指令,又會出現什麼
  • 打開 ~/.rvm/gems 看看裡面有什麼東西

隨著 Swift Package Manager 逐漸成熟,以及其他套件管理的替代方案,也許有一天 CocoaPods 會走進歷史。不過還有很多不錯的開發工具依然可以用 RubyGem 來管理,像是 fastlane, synx, badge, jazzy…我們有機會再介紹。

--

--