[Android開發學iOS系列] iOS項目環境搭建和依賴管理

iOS項目環境搭建和依賴管理

一個項目總是會依賴一些庫, 有些是第三方的, 有些可能是項目自身爲了複用拆出去的.
現有主流的iOS依賴有多種形式, 比如CocoaPods, Carthage和swift package.

本文是一些環境搭建和使用項目依賴相關的筆記.

全局環境準備

基本上iOS開發都要準備的環境, 這些設置是全局的, 在每個機器上設置一次就行. (本文爲mac環境).

homebrew: (已有可跳過)

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

rbenv

rbenv是一個管理ruby版本的工具, 如果同一個機器上有多個代碼庫, 可以用它來靈活切換ruby在不同項目中的版本.

具體可以看一下項目介紹: https://github.com/rbenv/rbenv

setup ruby (這裏選一個全局的版本號, 可根據具體情況更改):

brew install rbenv ruby-build

rbenv install 3.1.3

echo "export PATH=\"/opt/homebrew/bin/rbenv:\$PATH\"" >> ~/.zshrc
echo "eval \"\$(/opt/homebrew/bin/rbenv init -)\"" >> ~/.zshrc

source ~/.zshrc
rbenv global 3.1.3

驗證安裝成功:

ruby -v 
//得到剛剛指定的版本
which ruby 
//得到目錄: $HOME/.rbenv/shims/ruby

Bundler和CocoaPods

Bundler(https://bundler.io/)和CocoaPods(https://cocoapods.org/)都是dependency manager.

它們管理的依賴種類不同.

Bundler用來下Ruby gems, 即Gemfile中的依賴.

CocoaPods用來下pod, 即Podfile中寫的pods依賴.

但cocoapods本身是一個ruby gem, 所以它被bundler管理.

(可以想象bundler是大經理, cocoapods是小領導, 此處可以畫一個樹形圖表示, 如果我記得的話.) (但是我突然決定不畫了, 因爲懶.)

iOS世界中還有一個著名的ruby gem是fastlane, 本文並不涉及就不展開講了.

我們先把這兩個工具安裝到電腦上:

gem install bundler
gem install cocoapods
pod setup

Optional

你可能還需要的格式化工具:

brew install swiftformat

已有項目的配置

我們拿到一個新項目後往往需要拉它的依賴.

如果你的項目中有Gemfile文件

bundle install

之後發現還有Podfile文件:

bundle exec pod install

這些命令是每個項目都需要執行的, 當項目依賴變更時需要重新執行這些:

bundle install
bundle exec pod install

M1電腦可能需要配置:

bundle config build.ffi --enable-system-libffi
bundle config set --local path 'vendor/bundle'
// 這個命令運行完之後當前目錄下會多出一個`.bundle/`文件夾.

命令行中的工作就基本做完了, 剩下打開xcode, 如果還有swift package xcode會幫你解析的.

CocoaPod

這裏以CocoaPod爲例講一下如何添加使用一個CocoaPod庫, 以及相關的文件.

安裝cocoapods這一步我們在之前setup環境的時候已經跑過了:

gem install cocoapods
pod setup

每一個機器只要跑一次就行, 可以跳過.

CocoaPods有一個公開的specifications repo:

https://github.com/CocoaPods/Specs

這是一箇中心化的代碼倉庫, 比較流行的庫都放在上面.

官網是: https://cocoapods.org/

在這裏可以搜索任何你想要的cocoapods庫.

使用一個公開的庫

讓我們拿一個比較流行的庫試試: https://github.com/Alamofire/Alamofire

首先在項目的根目錄run:

pod init

會創建一個Podfile. (如果項目中已經存在了會報錯.)

這個文件名是固定不變的.

用xcode打開這個文件:

open -a Xcode Podfile

裏面的內容是這樣: (這裏UsePublicCocoaPods是我的項目名)

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'UsePublicCocoaPods' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for UsePublicCocoaPods

end

我們在這裏加上一行, 用上Alamofire的最新版本:

target 'UsePublicCocoaPods' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for UsePublicCocoaPods
  pod 'Alamofire', '5.6.4'

end

然後:

bundle exec pod install

(這裏如果遇到問題, 記得在項目目錄中跑bundle config set --local path 'vendor/bundle').

安裝完成之後會產生一些diff.

  • 項目下多了Pods文件夾. (應該被ignore)
  • 多了Podfile.lock文件. (不應該被ignore)
  • UsePublicCocoaPods/UsePublicCocoaPods.xcworkspace/UsePublicCocoaPods/UsePublicCocoaPods.xcodeproj/project.pbxproj 都有改變.

這裏需要檢查一下.gitignore的配置.

然後就可以在代碼裏import Alamofire並使用它的代碼了.

Dependency management tools

iOS中有多種依賴管理工具類型:

  • CocoaPods
  • Carthage
  • Swift package manager

CocoaPods

CocoaPods
比較老的依賴類型, 但是很多項目仍然在用.

Carthage

Carthage
build出來的是字節碼, 一般也叫framework.

Swift package manager

swift-package-manager
比較新的依賴管理類型, 一般在Xcode的UI界面裏操作.
本文就不介紹了.

項目結構和其他Trouble Shooting

Files and folders

Xcode是一個神奇的IDE, 它的文件夾叫”Group”.
在其中的文件分爲”物理上存在”和”引用上存在”兩種情況.

  • 刪除文件的時候會問你只是刪了引用(僅在Xcode裏看不見)還是要進一步刪了這個文件(物理上也刪除).
  • 添加文件的時候僅僅拷貝到文件目錄裏是不夠的, 需要”Add Files”, 打開目錄添加一下, 才能在Xcode裏也可見.

Project文件

ProjectName.xcodeproj/project.pbxproj
Project文件挺煩人的, 每新增/重命名一個文件它都會有diff.

有一些腳本工具可以幫忙將文件排序: https://github.com/WebKit/webkit/blob/main/Tools/Scripts/sort-Xcode-project-file

這樣產生diff之後運行一下(可以添加到git hook裏), 文件會有序一些, 多人合作的時候不容易產生衝突.

真機調試

真機調試需要有證書, 並不是隨便抓個機器連上線就能安裝應用.
當設備的OS版本較高但Xcode版本較低時, 可能需要添加一些DeviceSupport文件:

比如:

將所缺版本拷貝到這個目錄: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

重啓xcode再試.

References

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章