DAVID ZHANG
<< Back
我是如何初始化 Mac 环境的

每个开发者或许都有自己的 dotfiles,我也不例外。这是对于一些复杂的命令行工具(vim、bash 等)配置的备份,并且衍生出了初始化一台新电脑环境的自动化脚本。

在 GitHub 可以搜到很多点赞很多的 dotfiles 项目,相关配置十分全面,并且几乎自动化了所有东西。这些项目做的都很好很有参考意义,但因为每个人实际的个性化配置需求很强,所以只能说进行参考,没法全盘使用。

一些无法自动化的东西也需要文档来指导如何手动配置,比如 KrauseFx/new-mac 就是完全通过文档指导。

我希望在得到一台崭新 Mac 时,只需要执行自动化脚本完成80%的工作,并且按照文档配置剩余20%无法自动化的部分。

准备工作

首先,先参照 KrauseFx/new-mac 撰写 README ,把步骤用文本的形式写好。即使自动化了,文档也是有必要的。

然后,为了让后续工作可以进行,我们先安装 macOS Command Line Tools。

xcode-select --install

也可以选择下载安装 https://developer.apple.com/download/more/

Homebrew

Homebrew 是 macOS 中必备的包管理工具。通过 Homebrew 可以无需 root 一键安装各类软件,省去复杂的依赖管理和编译参数配置。

同时,Homebrew Cask 还可以安装非命令行编译类程序,也就是平时日常用的软件都可以用 Homebrew Cask 进行安装。

Homebrew 强大的能力让自动初始化的第一步成为可能。

所以第一步,我们先安装 Homebrew:

if test ! $(which brew); then
  echo "Installing homebrew..."
  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
fi

Homebrew Bundler

Homebrew 不仅仅是一个包管理器,还具有软件依赖管理能力。通过 Homebrew Bundler1 可以帮你解决所有软件依赖,包括官方的 formula 以及 cask,甚至还包括 Mac App Store(简称 mas)中的应用。我们只需要一个 Brewfile,就可以配置好所有需要的应用。

Homebrew 默认就安装了 Homebrew Bundler。

如果你的安装列表已经足够干净,那么可以执行 brew bundle dump 来生成现有依赖,输出到 Brewfile

$ brew bundle dump
$ cat Brewfile

brew "git"
brew "wget"
brew "mas"
brew "p7zip"
...

如果想自己写也比较容易,Brewfile 是一种简单的 Ruby DSL,写起来比大部分配置文件都简单。熟悉 Ruby 的人应该不太需要解释,毕竟 Ruby 自己就有 Bundler 这套东西,Brewfile 和 Gemfile 属于对应关系。

普通用户写 Brewfile 也并不困难,只需要掌握一些常用到的命令,主要有 brew, tap, caskmas

这四条命令分别对应:

  • brew install
  • brew tap
  • brew cask install
  • 就是之前文章中介绍过的 Mac App Store 命令行工具。

命令行类应用:

brew "git"
brew "wget"
brew "zsh"
brew "vim"

非命令行类:

cask "google-chrome" # Chrome 浏览器
cask "alfred"
cask "sublime-text"
cask "visual-studio-code"

非官方 Formula 应用:

tap  "heroku/brew"
brew "heroku"
tap  "homebrew/cask-fonts"
cask "font-source-code-pro"

Mac App Store 上的应用:

mas "WeChat", id: 836500024

因此,只要维护好 Brewfile 那么应用自动化安装就完全解决了。

只需要运行:

brew bundle

zsh/oh-my-zsh

Zsh 也就是 Z Shell,比起更加原生的 Bash。Zsh 的命令补全、主题系统和插件系统等都更加强大2

但想自己进行配置,学习和开发成本都比较高,因此就需要 Oh My Zsh。

Oh My Zsh 是个开源社区驱动的项目,简单的说就是集成一些常见的 Zsh 配置、插件和主题。我们需要做的只是配置一些简单直观的参数。甚至说,什么都不做,也有一个默认的开箱即用的配置。

Oh My Zsh 的 README 3中说到:

Oh My Zsh will not make you a 10x developer…but you might feel like one.

这句话十分风趣。虽然用了 Oh My Zsh 效率不一定能提升10倍,但至少「自我感觉」是这样的 :)

Zsh 在上一节已经通过 Homebrew Bundler 安装了,这里需要设置成默认 shell:

# 把 zsh 加入 shell 列表
sudo sh -c 'echo /usr/local/bin/zsh >> /etc/shells'
# 设置 zsh 为默认 shell
chsh -s $(which zsh)

然后安装 Oh My Zsh:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

dotfiles

dotfiles 非常因人而异,对于我来说主要用 vim 和 zsh,因此主要配置这两个。脚本化比较简单,只需要 cp

cp .bash_profile .zshrc .vimrc ~/
cp -r zarniwoop.vim/colors ~/.vim/

最后,启用 fzf:

$(brew --prefix)/opt/fzf/install

开发相关

也是因人而异,我平时主要用 Go 和 Ruby。

Go 需要配置:

mkdir -p ~/go

并在 .zshrc 加入:

export GOROOT=`brew --prefix go`/libexec
export GOPATH=~/go
export PATH=$PATH:$GOPATH/bin

Ruby 则要配置 .gemrc 和代理:

cp .gemrc ~/
gem install bundler
bundle config mirror.https://rubygems.org https://gems.ruby-china.com

编辑器用 Sublime Text 和 VS Code,增加快捷方式:

sudo ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl ~/Applications/subl
sudo ln -s /Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code ~/Applications/code

应用配置

针对配置来说,应用可以分为四种:

  • 云端配置:各种互联网公司的产品大多都是,不需要太关心配置同步的问题,只需要完成登录就好。比如:Chrome。
  • dotfiles 风格配置:既然是 dotfiles 风格,那也可以用 dotfiles 的方式,直接提交到 dotfiles 中就好了。比如:Karabiner 和 Shadowsocksx-NG。
  • 可同步配置:可以通过云端网盘进行同步,比如 Alfred 和 Dash。这种国内环境可以使用坚果云同步。
  • 无解的:那就只能无解了。

具体需要视情况而定,还有一些稍微特殊的。比如说 VS Code,配置部分可以用 Settings Sync 插件同步,插件的话可以通过命令行模式,也能做到自动安装。

# VS Code CLI 模式安装插件
code --install-extension arcticicestudio.nord-visual-studio-code
code --install-extension ms-vscode.Go
code --install-extension Shan.code-settings-sync
...

更多此类的东西,需要自己探索和总结。

macOS 配置

macOS 的配置目前是手动,按理来说可以通过 defaults 进行配置。但目前还没有找到每一个的配置项,缺少的暂且手动解决,等 hack 完再来更新。

已有的可以参考 mathiasbynens/dotfiles 中的 .macos 文件4,覆盖了大多数。

最后

为了测试这一套东西的确 work,我把家里的 Mac Book Air 2013 给重置了,创造了一个崭新的 Mac。经过实战测试的确可用 :)

把成品 crispgm/dotfiles 分享出来,不求能直接用,也是给大家参考。