M1 MacBook开发环境配置记录
新 MacBook 采用了 arm 架构的 Apple Silicon 芯片,虽说在能耗比上有了巨大的提升,但新的架构却给开发带来了不少困扰。arm 的开发环境能更好地利用性能,但出于兼容性的考虑,很多情况下仍然需要 x86 的开发环境。因此,本文整理了在新 MacBook 上配置 arm 架构和 x86 架构的开发环境共存的方法。
XCode Command Line Tools和Rosetta 2
安装 CLT:
1 | |
安装 Rosetta 2:
1 | |
Shell工具
iTerm2
iTerm2 是一款拥有许多功能的终端模拟器,可以替代 MacOS 自带的“终端”。
- 下载并安装 iTerm2。(可选:iTerm 颜色方案下载);
- 打开 Finder,按下
⌘+⇧+A,找到“iTerm”,右键 > 复制; - 将复制出来的图标重命名为“iTerm (Rosetta)”,右键 > 显示简介,勾选“使用 Rosetta”打开。
这样就可以用“iTerm”进入 arm64 架构的 shell,用“iTerm (Rosetta)”进入 x86_64 架构的 shell 了!
oh-my-zsh
oh-my-zsh 是一款增强 zsh 功能的框架。安装:
1 | |
powerlevel10k
powerlevel10k 是一款 oh-my-zsh 的主题。安装:
1 | |
运行 nano ~/.zshrc,找到 ZSH_THEME 一行并改为:ZSH_THEME="powerlevel10k/powerlevel10k"。
显示当前架构
为了方便使用,可以在主题中添加当前架构的显示。运行 nano ~/.p10k.zsh,找到 POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION 一行并改为 typeset -g POWERLEVEL9K_OS_ICON_CONTENT_EXPANSION=$'\uE711 $(uname -m)' 。如果主题被配置为显示系统标志,那么标志右侧就会显示当前架构。
显示NodeJS版本
运行 nano ~/.p10k.zsh,找到 POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS,取消注释 node_version 一行。在有 package.json 的目录下就会显示 Node.js 的版本。
z
z 是 oh-my-zsh 自带的一款插件,能够简化在目录之间跳转的流程。例如,你曾经运行过 cd /Users/YOUR_NAME/MyProjects 来跳转到 MyProjects,那么之后你可以执行 z MyProjects 甚至是 z Projects 来达到同样的目的。
启用插件:运行 nano ~/.zshrc,找到 plugins 一行并改为:plugins=(... z)。
zsh-syntax-highlighting
zsh-syntax-highlighting 是一款语法高亮插件,能够用不同的颜色来标识正确和错误的语法。安装:
1 | |
启用插件:运行 nano ~/.zshrc,找到 plugins 一行并改为:plugins=(... zsh-syntax-highlighting)。
zsh-autosuggestions
zsh-autosuggestions 是一款命令提示和补全插件,能够根据历史输入来提供命令提示,按下 → 即可自动补全。安装:
1 | |
启用插件:运行 nano ~/.zshrc,找到 plugins 一行并改为:plugins=(... zsh-autosuggestions);并在底部添加一行:bindkey '^O' autosuggest-accept,这样按 ⌃+O 也能接受提示的内容了。
如果在 iTerm 中看不到命令提示的内容,需要按下 ⌘+,,前往 Profiles > Colors,确保 Basic Colors > Background 和 ANSI Colors > Bright > Black 是不同的。
zsh-history-substring-search
zsh-history-substring-search 是一款快速搜索历史输入的插件。例如,你曾经运行过 docker container ls,那么你输入 container 就可以搜索到之前的命令。安装:
1 | |
启用插件:运行 nano ~/.zshrc,找到 plugins 一行并改为:plugins=(... zsh-history-substring-search);并在底部添加两行:bindkey '^P' history-substring-search-up 和 bindkey '^N' history-substring-search-down,这样在输入搜索关键字后,按 ⌃+P 就可以向前搜索,按 ⌃+N 就可以向后搜索。
注意,如果同时使用 zsh-syntax-highlighting 和 zsh-history-substring-search,请确保 plugins 中 zsh-syntax-highlighting 在zsh-history-substring-search 之前。
添加命令别名
运行 nano ~/.zshrc,找到 alias,可以有选择性地添加一些常用的命令别名:
1 | |
Homebrew
Homebrew 是一款很好用的包管理器。安装 arm 架构版本:
1 | |
安装 x86 架构版本:
1 | |
将两个版本的 Homebrew 添加到 PATH:运行 nano ~/.zshrc,在底部添加:
1 | |
这样在不同架构的 iTerm 中,就会添加对应版本的 Homebrew 到 PATH。
Miniconda
Miniconda 是一款很好用的 Python 环境管理器。安装 arm 架构版本:
1 | |
安装路径输入:/Users/YOUR_NAME/opt/miniconda3-arm64;最后询问是否需要运行 conda init 初始化输入 no。
安装 x86 架构版本:
1 | |
安装路径输入:/Users/YOUR_NAME/opt/miniconda3-x86_64;最后询问是否需要运行 conda init 初始化输入 no。
最后,将两个版本的 Miniconda 添加到 PATH:运行 nano ~/.zshrc,在底部添加:
1 | |
这样在不同架构的 iTerm 中,就会添加对应版本的 Miniconda 到 PATH。
C/C++ 和 Node.js
无论是 MacOS 自带的 gcc/g++ 编译器,还是通过 Homebrew 安装的 CMake,都同时支持 arm 和 x86 两个架构,因此 C/C++ 环境的搭建要相对简单一些。Node.js 环境的搭建则可以通过 Homebrew 安装 nvm 之类的工具来解决,而且 Node.js 环境对于架构更加不敏感一些。因此本文不再赘述相关步骤。