背景:在项目开始发时候,每当有新同学进入项目,或者是某些同学升级了某些软件,就可能会遇到一些环境问题。比如ruby环境、CocoaPods环境等,这些环境引起的问题有时候不好解决不好排查,会浪费很多不必要的时间。
目标:确保同一项目的所有成员在开发时的环境是一致的,实现自动化环境安装。
步骤
Xcode
确保同一项目组的所有同学使用同一个版本的Xcode。如果Xcode版本不同,可以到这里去找对应的Xcode版本。
有时候我们会同时开发多个项目,这样有可能要安装多个不同版本的 Xcode(这情况很少见)。为了保证所使用的版本一致,在每次执行自动化命令之前(如执行bundle exec fastlane test),要先使用xcode-select -s来选择该项目所对应版本的 Xcode。如xcode-select -s /Applications/Xcode13.0.app/Contents/Developer
rbenv
rbenv 是 Ruby 环境管理工具,能够安装、管理、隔离以及在多个 Ruby 版本之间切换,使用它来确保ruby环境的一致性
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
$ brew install rbenv ruby-build
参考:
接着我们就可以安装和设置项目的 Ruby 环境了。
$ cd $(PROJECT_DIR)
$ rbenv install 2.7.2
$ rbenv local 2.7.2
此处把 ruby 的环境设置为 2.7.2,会在项目下生成一个 .ruby-version 文件,该文件就一个字符串 2.7.2。可以通过 rbenv local 进行修改,也可以直接修改这个文件的内容。该文件通过 git 进行管理,每个项目组同学通过这个文件就可以同步 ruby 版本了。
RubyGems 和 Bundler
RubyGems 和 Bundler 主要是用来安装和管理 CocoaPods 和 fastlane 等第三方工具。
- RubyGems:是 Ruby 依赖包管理工具。
- 在 Ruby 中,包叫作 Gem,我们可以通过
gem install命令来安装
- 在 Ruby 中,包叫作 Gem,我们可以通过
- Bundler:用来检查和安装 Gem 的特定版本,以此为 Ruby 项目提供一致性的环境。
- 执行
gem install bundler命令安装Bundler - 执行
bundle init就可以生成一个 Gemfile 文件,像 CocoaPods 和 fastlane 等依赖包,我们就可以添加到这个文件里面 - 当使用各个 Gem 工具的时候,也需要使用 Bundler。例如在使用 CocoaPods 时要执行
bundle exec pod,以保证我们使用的是项目级别而不是操作系统级别的 Gem 工具
- 执行
如下:
source "https://rubygems.org"
gem "cocoapods", "1.11.3"
gem "fastlane", "2.166.0"
执行bundle install来安装各个 Gem。 Bundler 会自动生成一个 Gemfile.lock 文件来锁定所安装的 Gem 的版本。
DEPENDENCIES
cocoapods (= 1.11.3)
fastlane (= 2.166.0)
把 Gemfile 和 Gemfile.lock 一同提交到 Git,保证其他同学都可以使用版本号一致的 Gem。
而且上面这些工作都可以通过一个脚步就能完成
# 获取ruby版本
ruby_version=`cat .ruby-version`
rbenv install $ruby_version;
# 安装bunlder
gem install bundler
# 安装gems
bundle install
# 安装pods
bundle exec pod install
pod 安装完后会生成 Podfile.lock 文件,注意把 Podfile 和 Podfile.lock 文件都使用 git 管理。
执行完以上脚本,安装完所有的 pod 后就可以打开项目了
.gitignore 文件
可以在 github 上找到对应的文件,可以指定 git 管理的文件以及忽略的文件。如一些个人配置文件可以被忽略。
总结
通过以上步骤,使用Xcode、rbenv、RubyGems 和 Bundler 就可以搭建一个统一的 iOS 开发和构建环境。
- Xcode
- 确保编辑 IDE 的一致
- rbenv
- 确保 ruby 的一致性
- RubyGems 和 Bundler
- 确保 gems 的一致性
- .gitignore
- 确保一些无用的文件不被 git 管理