iOS項目環境搭建和依賴管理 一個項目總是會依賴一些庫, 有些是第三方的, 有些可能是項目自身為了復用拆出去的. 現有主流的iOS依賴有多種形式, 比如CocoaPods, Carthage和swift package. 本文是一些環境搭建和使用項目依賴相關的筆記. 全局環境準備 基本上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
這是一個中心化的代碼倉庫, 比較流行的庫都放在上面.
在這裡可以搜索任何你想要的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
的配置.
- 這個網站可以搜搜不同的項目通常的配置: https://www.toptal.com/developers/gitignore/, 比如: https://www.toptal.com/developers/gitignore/api/swift,cocoapods,xcode
- 這裡也有一個: https://github.com/github/gitignore/blob/main/Swift.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
- Swift Package Manager vs CocoaPods vs Carthage for All Platforms
- The Podfile
- Create useful .gitignore files for your project
出處: 博客園: 聖騎士Wind
Github: https://github.com/mengdd
微信公眾號: 聖騎士Wind