01 | 開發環境:如何使用 Ruby 工具鏈統一開發環境?

[toc]

本文來自拉勾網課程整理。

開發環境

iOS 開發過程中,你是不是會經常遇到這些情況:

每次打開一個新項目,都需要手動搭建開發環境;有時候在安裝第三方工具時使用到 sudo 權限,導致以后安裝工具都需要手工輸入密碼而無法實施自動化。還有,每當啟動一臺新 CI時,就需要手工登錄并配置一遍,更可怕的是,原先搭建好的CI會隨著Xcode 版本更新需要重新配置。

為什么會這么麻煩呢?就是因為你在項目開始之初沒有做好統一配置。

所謂統一配置,就是所有的配置信息都以文本的格式存放在 Git里面,我們可以隨時查看修改記錄,以此來幫助我們比較不同配置之間的差異性,然后在這個基礎上不斷更新迭代。

可以說,有了統一配置,任何工程師都可以搭建出一模一樣的開發環境,構建出功能一致的 App;有了統一配置,還可以讓我們按需延展 CI服務,而不用任何手工操作。更重要的是,它還可以應用到各個類似的iOS項目中,極大地減輕了項目前期的搭建成本。

既然統一的配置那么重要,那么我們怎樣搭建統一配置的開發環境呢?

Ruby 工具鏈

我們可以通過 Ruby 工具鏈為整個項目搭建一致的開發和構建環境。為什么選擇 Ruby 而不是其他語言環境呢? 因為在 iOS 開發方面,目前流行的第三方工具 CocoaPodsfastlane 都是使用 Ruby 來開發的。特別是 Ruby 有非常成熟的依賴庫管理工具 RubyGemsBundler,其中 Bundler 可以幫我們有效地管理 CocoaPodsfastlane 的版本。

下面一起來看看怎樣搭建一個統一的開發環境吧。

ce61b923c0dc2a15d35cdae49e7e69f5

開發環境統一配置圖

通常,統一的開發環境應該從操作系統開始。對于 iOS 開發來說,MacOS 是目前 iOS 開發唯一支持的操作系統。在公司,MacOS 的版本一般由 IT 部門統一管理和更新。要注意,當公司統一更新了我們開發環境的 MacOS 版本以后,需要同時更新 CIMacOS 的版本,以保持一致。

Xcode

位于 MacOS 上層的是 Xcoderbenv。其中,XcodeiOS 開發和構建工具,在同一個項目里,最好使用同一個版本的Xcode 進行開發和構建,我們可以在項目的 README.md 文件標注 Xcode 的版本。

像我們將要開發的這款類似朋友圈的 Moments App 項目,我就在對應的 README.md 文件里標明了需要使用 Xcode Version 12.2 (12B45b)。具體內容你也可以在代碼倉庫找到。

96b37a6560410fdf9cdbba71aaa4663d

那我們怎樣才能保證每個人都安裝同一個版本號的 Xcode 呢?技巧就是我們不要到有自動更新功能的 Mac App Store 中下載 Xcode,而是到蘋果的開發者網站搜索并下載。

有時候我們會同時開發多個項目,這樣有可能要安裝多個不同版本的 Xcode。如果你的機器有多于一個版本的Xcode,此時需要特別注意,為了保證所使用的編譯器版本一致,在每次執行自動化命令之前(如執行bundle exec fastlane test),要先使用xcode-select -s來選擇該項目所對應版本的 Xcode

比如說我的電腦上有多個 Xcode 版本,在開發 Moments App 時,每次執行自動化命令之前都會執行這樣一條命令xcode-select -s /Applications/Xcode12.2.app/Contents/Developer來選擇 Moments App 項目所使用的 Xcode。這里的Xcode12.2.app就是我安裝的 Xcode 12.2版所在的位置。

rbenv

有了版本一致的 Xcode 以后,因為后期我們會用到 CocoaPods 等第三方 Ruby工具,為了自動化安裝和管理這些工具,整個項目團隊所使用的 Ruby版本也必須保持一致。為此,我們就需要用到 Ruby環境管理工具。

目前流行的 Ruby 環境管理工具有 RVMrbenv。我推薦使用的是 rbenv,因為它使用shims 文件夾來分離各個 Ruby 版本,相對于 RVM 更加輕裝而方便使用。千萬注意,團隊內部不要同時使用不同的 Ruby 環境管理工具,否則項目編譯會出錯。

rbenvRuby 環境管理工具,能夠安裝、管理、隔離以及在多個 Ruby 版本之間切換。要使用 rbenv,我們可以通過 Homebrew 來安裝它,下面是安裝 Homebrewrbenv 的腳本。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brew install rbenv ruby-build rbenv-vars

一旦安裝rbenv 完畢,我們需要把以下的設置信息放到你的 Shell配置文件里面,例如 ~/.bash_profile 或者 ~/.zshrc 等文件,這樣能保證每次打開終端的時候都會初始化 rbenv

export PATH="$HOME/.rbenv/bin:$PATH" 
eval "$(rbenv init -)"

接著我們就可以安裝和設置項目的 Ruby 環境了。

$ cd $(PROJECT_DIR)
$ rbenv install 2.7.1
$ rbenv local 2.7.1

此處是把項目的 Ruby 環境配置為 2.7.1 版本。rbenv 會幫我們建立 一個叫作.ruby-version 的文件,該文件里面只保存一個版本號(例如2.7.1)的字符串。這個包含了版本號的文件可以用 Git 進行管理。如果要更新版本,可以通過rbenvlocal命令進行,每次更新也由 Git 統一管理,這樣就能讓其他開發者使用同一版本的 Ruby 開發環境了。

RubyGems 和 Bundler

RubyGemsBundler主要是用來安裝和管理 CocoaPodsfastlane 等第三方工具。

具體來說,RubyGemsRuby 依賴包管理工具。在 Ruby 的世界,包叫作 Gem,我們可以通過gem install命令來安裝。但是 RubyGems 在管理 Gem 版本的時候有些缺陷,就有人開發了 Bundler,用它來檢查和安裝 Gem 的特定版本,以此為 Ruby 項目提供一致性的環境。

要安裝 Bundler,我們可執行gem install bundler命令進行,之后,再執行bundle init就可以生成一個 Gemfile 文件,像 CocoaPodsfastlane 等依賴包,我們就可以添加到這個文件里面。

具體代碼如下:

source "https://rubygems.org"
gem "cocoapods", "1.10.0"
gem "fastlane", "2.166.0"

注意我們在gem命令里面都指定了依賴包的特定版本號。例如,在我們的 Moment App 就使用了1.10.0版的 CocoaPods,然后執行bundle install來安裝各個 GemBundler會自動生成一個 Gemfile.lock 文件來鎖定所安裝的 Gem 的版本,例如:

DEPENDENCIES
  cocoapods (= 1.10.0)
  fastlane (= 2.166.0)

為了保證團隊其他成員都可以使用版本號一致的 Gem,我們需要把GemfileGemfile.lock 一同保存到 Git 里面統一管理起來。

到此為止,我們已經知道怎樣使用 Ruby工具鏈配置一個統一的開發環境。但在真實的開發環境中,搭建環境只需要一個人來完成即可,其他成員執行以下腳本就能完成整套開發環境的搭建。

$ ./scripts/setup.sh

我們一起看看這個腳本做了些什么?

復制代碼

# Install ruby using rbenv
ruby_version=`cat .ruby-version`
if [[ ! -d "$HOME/.rbenv/versions/$ruby_version" ]]; then
  rbenv install $ruby_version;
fi
# Install bunlder
gem install bundler
# Install all gems
bundle install
# Install all pods
bundle exec pod install

該腳本主要做了四件事情,
第一步是在 rbenv下安裝特定版本的 Ruby 開發環境,
然后通過 RubyGems 安裝 Bunlder
接著使用 Bundler 安裝 CocoaPodsfastlane 等依賴包,
最后安裝各個 Pod。這樣,一個統一的項目環境就搭建完成了,接下來開發者就可以打開 Moments.xcworkspace進行開發了。

說完 Ruby 環境搭建以后,最后我們一起聊聊保證項目文件一致性的 .gitignore 文件。

.gitignore 文件

.gitignore 文件是一個配置文件,用來指定讓 Git 需要忽略的文件或者目錄。如果沒有.gitignore 文件,項目成員可能會不小心把一些自動生成等無關重要的文件或者具有個人信息(例如 xcuserdata)的文件保存到 Git 里面。這就大大增加了查看 Git 修改歷史的難度。因此,在項目初期就配置一個合適的.gitignore文件,能減輕后續的管理工作。

如何創建 .gitignore 文件呢?

我一般會在gitignore.io 里面輸入關鍵字,例如 Xcode,Swift等,然后該網站會幫我們生成一個默認的.gitignore文件。咱們項目 Moments App.gitignore 文件你可以到拉勾教育的倉庫中查看。

總結

以上,我們通過Xcode、rbenv、RubyGems 和 Bundler 搭建一個統一的 iOS 開發和構建環境。

9e9486751281fbe2e942cf7c48dddd51

再次強調下,為了讓各個開發和構建環境能保持一致,我們要把 .ruby-versionGemfileGemfile.lock 文件通過Git統一管理起來,并共享給整個項目團隊使用。

而且,由于我們的開發環境已經通過Bundler管理起來,今后,當使用各個 Gem工具的時候,也需要使用 Bundler。例如在使用 CocoaPods 時要執行bundle exec pod,以保證我們使用的是項目級別而不是操作系統級別的 Gem 工具。

相關配置連接

安裝ruby

rbenv可以幫助你在一臺機器上建立多個版本的ruby環境, 并提供方便的切換方法。
注意:rbenvrvm是不兼容的,所以安裝rbenv之前要先把rvm卸載。

Mac 安裝ruby
使用 rbenv 安裝和管理 Ruby 版本

安裝ruby

Mac 解決brew一直卡在Updating Homebrew

安裝問題記錄

  • 報錯
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

輸入命令移除代理

git config --global --unset http.proxy

Bundler

Bundler in iOS project淺析

fastlane使用說明書

fastlane使用說明書

FastLane

FastLane

iOS效率神器fastlane自動打包

iOS效率神器fastlane自動打包
使用Fastlane對iOS項目持續交付(自動打包)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容