Ruby工具链
我们可以通过Ruby工具链为整个项目搭建一致的开发和构建环境。为什么选择Ruby而不是其他语言环境呢?因为在iOS开发方面,目前流行的第三方工具CocoaPods和 fastlane都是使用Ruby来开发的。特别是Ruby有非常成熟的依赖库管理工具 RubyGems和Bundler,其中Bundler可以帮我们有效地管理CocoaPods和 fastlane的版本。
rbenv
目前流行的Ruby环境管理工具有RVM和rbenv。我推荐使用的是rbenv,因为它使用shims文件夹来分离各个Ruby版本,相对于RVM更加轻装而方便使用。千万注意,团队内部不要同时使用不同的Ruby环境管理工具,否则项目可能编译会出错。
rbenv是Ruby环境管理工具,能够安装、管理、隔离以及在多个Ruby版本之间切换。要使用rbenv,我们可以通过Homebrew来安装它,下面是安装Homebrew和rbenv的脚本。
/// 安装Homebrew
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
/// 安装rbenv
brew install rbenv ruby-build rbenv-vars
如果安装Homebrew慢或者遇到问题可参考传送门
一旦安装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进行管理。如果要更新版本,可以通过rbenv local命令进行,每次更新也由Git统一管理,这样就能让其他开发者使用同一版本的Ruby开发环境了。
RubyGems 和 Bundler
RubyGems和Bundler主要是用来安装和管理CocoaPods和fastlane等第三方工具。
具体来说,RubyGems是Ruby依赖包管理工具。在Ruby的世界,包叫作Gem,我们可以通过gem install命令来安装。但是RubyGems在管理Gem版本的时候有些缺陷,就有人开发了Bundler,用它来检查和安装Gem的特定版本,以此为Ruby项目提供一致性的环境。
要安装Bundler,我们可执行gem install bundler命令进行,之后再执行bundle init就可以生成一个Gemfile文件,像CocoaPods和fastlane等依赖包,我们就可以添加到这个文件里面。
source "https://rubygems.org"
gem "cocoapods", "1.10.0"
gem "fastlane", "2.166.0"
注意我们在gem命令里面都指定了依赖包的特定版本号。例如,在项目中使用了1.10.0版的CocoaPods,然后执行bundle install来安装各个Gem。Bundler会自动生成一个Gemfile.lock文件来锁定所安装的Gem的版本,例如:
DEPENDENCIES
cocoapods (= 1.10.0)
fastlane (= 2.166.0)
为了保证团队其他成员都可以使用版本号一致的Gem,我们需要把Gemfile和 Gemfile.lock一同保存到Git里面统一管理起来。
一键搭建脚本
# 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
.gitignore文件
.gitignore文件是一个配置文件,用来指定让Git需要忽略的文件或者目录。如果没有 .gitignore文件,项目成员可能会不小心把一些自动生成等无关重要的文件或者具有个人信息(例如xcuserdata)的文件保存到Git里面。这就大大增加了查看Git修改历史的难度。因此,在项目初期就配置一个合适的.gitignore文件,能减轻后续的管理工作。
再次强调下,为了让各个开发和构建环境能保持一致,我们要把 .ruby-version、 Gemfile和Gemfile.lock文件通过Git统一管理起来,并共享给整个项目团队使用。
而且,由于我们的开发环境已经通过Bundler管理起来,今后当使用各个Gem工具的时候,也需要使用Bundler。例如在使用CocoaPods时要执行bundle exec pod,以保证我们使用的是项目级别而不是操作系统级别的Gem工具。
参考
1、www.bundler.cn/
2、www.toptal.com/developers/…
3、brew.sh/blog/