内容只讲述在iOS和Flutter中的应用。
作为一名移动端开发人员,不论是iOS还是Android,一些工具的使用是必须的,也是必要的,因为工具能提高我们的开发效率,也能使我们的项目更具结构化.但这些工具的使用也给我们带来一些困扰,多人开发甚至不同部门协作配合开发的时候,成员之间工具版本不一致,导致Git管理代码困难,冲突不断,新人融入搭建环境繁琐,权限设置等一些列问题。
出现上述情况的时候,就需要对项目进行统一配置。
什么是统一配置
所谓统一配置,就是所有的配置信息都以文本的格式存放在Git里,我们可以随时查看修改记录,并比较不同配置之间的差异.更有趣的是有了统一配置任何开发人员都可以搭建出一样的开发环境,构建出功能一致的APP。
首先介绍mac 上常用的软件包管理工具,
- Homebrew,是一个MacOS上的软件包安装工具,通过命令行的方式安装和卸载软件,大部分的流行软件都提供了 Homebrew 的安装方式,也是开源世界里安装和更新软件的主流方式;
- RubyGems,是一个包管理框架,提供了ruby社区的gem的托管服务,用于ruby软件包的下载、安装、使用;ruby的软件包被称为gem,包含了ruby应用或库。
Homebrew常用命令
查找软件包
brew search git
安装软件包
brew install git
列举通过Homebrew安装的程序
brew list
卸载软件包
brew uninstall git
查看软件包信息
brew info git
更新HomeBrew
brew update
brew
和gem
不同,brew
用于操作系统层面上软件包的安装,而gem
只是管理ruby
软件。
怎样构建统一环境
上面简单介绍了一下管理包工具,那怎么利用这些工具来构建自己的环境,通常iOS开发中流行的第三方工具有Cocoapods和fastlane,而它们都是使用Ruby来开发的,而且Ruby有非常成熟的依赖库管理工具RubyGems和Builder,那么我们就可以通过Ruby工具链来为整个项目搭建一致的开发和构建环境。
整个链路如下图:
Xcode
Xcode是iOS开发和构建工具,在同一个项目里,最好实验同一版本的Xcode进行开发和构建,可以在README.md文件标注Xcode版本。
rbenv
rbenv是Ruby环境管理工具,能够安装,管理,隔离以及在多个Ruby版本之间切换.我们首先通过HomeBrew来安装,
brew install rbenv ruby-build rbenv-vars
安装rbenv后,配置环境,打开~/.bash_profile或者~/.zshrc,这样保证每次打开终端的时候都会初始化rbenv,
export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)"
编辑结束后执行
source .zshrc
现在我们就可以安装和设置项目的Ruby环境了,
cd $(PROJECT_DIR) rbenv install 2.7.1 rbenv local 2.7.1
rbenv会帮我们建立一个叫做.ruby-version的文件,该文件里面只保存一个版本号(例如2.7.1)的字符串.这个包含版本号的文件可以用Git管理.如果需要更新版本,可以通过rbenv local
命令进行,每次更新也由Git管理,这样所有的开发人员都使用统一版本的Ruby环境。
RubyGems和Bundler
RubyGems和Bundler主要用来安装和管理cocoapods和fastlane等第三方工具,具体讲RubyGems是Ruby依赖包管理工具,通过gem install
命令来安装.但是RubyGems版本管理,有时系统库和过期的依赖项或Ruby版本会妨碍简单的安装过程,所以有人就开发了Bundler,用它来检查和安装Gem的特定版本,为Ruby项目提供一致性的环境。
安装Bundler
gem install bundler
cd到项目目录
bundle init
就可以生成一个Gemfile文件,配置文件,也就是建立cocoapods和fastlane的版本,
source "https://rubygems.or g" gem "cocoapods", "1.12.0" gem "fastlane", "2.189.0"
执行bundle install
安装各个gem,Bundler会自动生成一个Gemfile.lock文件来锁定安装的Gem的版本.最后我们把Gemfile和Gemfile.lock使用Git管理,这样我们就构建了一个统一的开发环境。
当然,由于我们的开发环境已经通过Bundler管理起来,今后当使用各个Gem工具的时候,也需要使用Bundler.例如使用Cocoapods时要执行bundle exec pod
,以保证我们使用的是项目级别而不是操作系统级别的Gem工具。
Flutter中如何构建统一环境
flutter-wrapper
cd 到项目目录,执行命令下载脚本
curl -O https://raw.githubusercontent.com/zakiso/flutterw/master/flutterw && chmod 755 flutterw
在项目目录中使用
./flutterw init
该命令会收集当前系统中的flutter版本,并将相关信息写入flutter_wrapper.properties 文件中,然后团队中所有成员都会以该版本号作为该项目的标准版本,最后同样是将flutterw文件和flutter_wrapper.properties文件添加到git中提交到仓库里,其他成员拉取代码后在项目中使用flutter
命令的地方使用./flutterw
代替。
flutterw做了什么
- 使用flutterw的时候会获取当前目录下的flutter_wrapper.properties文件中的版本号;
- 去用户的${HOME}/flutter_wrapper/{版本号}/ 目录下查找是否有该版本sdk;
- 如果没有该版本sdk会下载下来,然后使用该目录下的sdk执行命令;
- 如果用户本地没有当前下载任何flutter sdk,也会进行下载。
如何更简单的使用统一环境中的各种命令
上面我们构建了自己项目级别的环境,但同时也增加了使用命令行的负担.任何架构的设计,思想的应用都是为了方便,我们同样如此,统一环境的构建带来了一定的负担,虽然这个负担是我们可以接受的,但我们还是想把这个负担做到最小化,如何去更简洁的使用这些命令呢?
alias命令别名
我们通过alias配置把一些常用的命令通过别名的方式简化操作,
编辑~/.bash_profile,比如
# git alias gck='git checkout' alias gm='git merge' alias gb='git branch' alias gbr='git branch -a' alias gs='git status' alias gc='git clone' alias gl='git log' alias ga='git add .' alias gpull='git pull' alias gpush='git push' alias gcm='git commit -m' # pod alias pru='pod repo update' alias pi='pod install' alias pu='pod update' # iOS 模拟器开启 alias iOSSimulator='open -a Simulator' # 终端打开应用程序 ## 浏览器打开 alias OpenWithSafari='open -a "/Applications/Safari.app" '
如果没有~/.bash_profile文件,那就直接创建一个.bash_profile,然后编辑
touch .bash_profile vim .bash_profile
编辑后保存,直接执行
source ~/.bash_profile
如果使用item2终端,配置~/.bash_profile会不生效,需要配置~/.zshrc,简单来说就是Terminal走了.bash_profile
,iterm2走了.zshrc
但作为一个开发人员,iterm2+oh-my-zsh+Solarized Dark Higher Contrast是必须的,这时候.zshrc
内容就比较多,看着一团乱
我们可以单独将命令别名的配置放在.bash_profile,然后同时运行.bash_profile和.zshrc,只需在.zshrc添加配置,
source ~/.bash_profile
这样做两方面的优势:
- .bash_profile不需要改动;
- 别名的配置做到隔离 。