前言:回头是岸的程序员
首先介绍一下我电脑的基本情况。我当年买的是2017款的Mbp,目前操作系统更新到macOS Monterey 12.0.1,Intel i5处理器,8G内存,256G硬盘。
作为我人生中唯一的苹果本,我还记得当初,买这台笔记本时的雄心壮志。据说:“用不好Win的人,是怪系统垃圾;但用不好Mac的人,只能怪自己笨”。虽然这台笔记本陪伴着我完成了大大小小四、五个项目,前前后后装过的软件、插件也不下100个,但说实话,时至今日,我依然觉得我并没有把Mac用的很好。当然,我也坚决不会承认自己是一个笨蛋~
作为一个有点强迫症和洁癖的人,我其实并不是很能接受每次因为各种原因卸载掉软件包后留下的“一地鸡毛”。特别是,在之后的某一天,当我因为各种原因,不得不去查看操作系统里某个包的版本时,看到的一堆乱七八糟的版本号,着实让人很不爽。但考虑到项目的时间和自己的头发,也只能一边随手百度一篇解决方案,一边安慰自己:环境问题,能跑就好。但其实只有我知道,我那台“高贵”的深空灰Mbp里装了多少垃圾,每次安装新包前,都要先在心里默默祈祷一遍一切顺利。
所有的改变开始于,我不再从事开发工作之后。彻底脱离写代码之后的第一件事,就是我花了大概一个晚上的时间把之前装过的各种和开发相关的软件逐一卸载、删除(除了JDK),当然使用的方法也是我随手百度到的一篇教程(事后证明:这种乱拳打死老师傅的方法并不靠谱,非常容易引发后期各种依赖混乱的问题)。但至少在当时的我看来,这种方法在一定程度上缓解了我的心理洁癖,让我对重新把Mac用好这件事,恢复了信心。要是能重来,我一定要好好管理我的各种软件包,and it's time now!
Part1:Homebrew从放弃到入门
说起homebrew,相信每一个使用macOS的开发者都或多或少听说过。但我想大部分人对于homebrew的了解,也仅限于知道这是一个基于git的包管理神器,很多复杂软件包都可以直接通过一行简单的“brew install”轻松完成。但就像“天下没有免费的午餐”一样,对于菜鸟程序员来说,再好用的工具在使用的时候也可能会遇到各种意想不到的问题。比如,当年为了安装TensorFlow,
Part2: Homebrew的安装和国内换源
由于某些众所周知的原因,Homebrew官方的安装方法在国内并不完全适用。好在天无绝人之路,虽然但是,我们还是可以通过换源大法,享受便捷的Homebrew管理。
官网安装命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2.1 先运行脚本试试
既然无论如何,我们都需要通过官方网址获取Homebrew的安装脚本,那就直接执行吧,看看会得到什么样的结果!
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
命令行返回的结果如下:
==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
Press RETURN/ENTER to continue or any other key to abort:
==> /usr/bin/sudo /usr/sbin/chown -R luna:admin /usr/local/Homebrew
==> Downloading and installing Homebrew...
remote: Enumerating objects: 970, done.
remote: Counting objects: 100% (707/707), done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 970 (delta 669), reused 690 (delta 657), pack-reused 263
Receiving objects: 100% (970/970), 487.44 KiB | 1.05 MiB/s, done.
Resolving deltas: 100% (730/730), completed with 140 local objects.
From https://github.com/Homebrew/brew
+ 064a1956f9...6096bc6d71 master -> origin/master (forced update)
* [new branch] dependabot/bundler/Library/Homebrew/addressable-2.8.1 -> origin/dependabot/bundler/Library/Homebrew/addressable-2.8.1
* [new branch] dependabot/bundler/Library/Homebrew/spoom-1.1.12 -> origin/dependabot/bundler/Library/Homebrew/spoom-1.1.12
Updating files: 100% (6994/6994), done.
HEAD is now at 6096bc6d71 Merge pull request #13716 from carlocab/cleanup-cleanup_path
fatal: unable to access 'https://github.com/Homebrew/homebrew-cask/': LibreSSL SSL_connect: Operation timed out in connection to github.com:443
fatal: unable to access 'https://github.com/Homebrew/brew/': LibreSSL SSL_connect: Operation timed out in connection to github.com:443
Error: Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask failed!
Fetching /usr/local/Homebrew failed!
Updated 2 taps (homebrew/core and caskroom/cask).
Failed during: /usr/local/bin/brew update --force --quiet
可以看到,脚本在安装brew和homebrew-cask的时候因为网络不通失败了。解决方法是执行如下命令,创建你本地的Homebrew目录。
git clone git://mirrors.ustc.edu.cn/homebrew-core.git/ /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/ --depth=1
2.2 设置Git远程地址
接下来,我们只需要对本地的Homebrew仓库定时更新,并通过各种brew install命令安装我们所需要的软件包即可。为此,我们需要将其远程版本库设置为国内可以直接获得的网络地址,具体操作如下:
1.将core、cask软件的下载地址设置为国内地址;
cd "$(brew --repo)"
git remote set-url origin https://mirrors.ustc.edu.cn/brew.git
cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
cd "$(brew --repo)"/Library/Taps/caskroom/homebrew-cask
git remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
2.设置bottle源的下载地址为国内地址。
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
至此,我们的Homebrew就完全配置好了,我们可以通过brew update来验证Homebrew是否能正常运行,确认无误后,让我们再用brew config检查一下Homebrew的当前的配置情况。
HOMEBREW_VERSION: 3.5.9-135-g6096bc6
ORIGIN: https://mirrors.ustc.edu.cn/brew.git
HEAD: 6096bc6d71bfb42f285a12414d3aee7fcee1ed75
Last commit: 24 hours ago
Core tap ORIGIN: https://github.com/Homebrew/homebrew-core
Core tap HEAD: 10b8920cc93bf9ef0681aa5cac97b9e30301d04d
Core tap last commit: 2 hours ago
Core tap branch: master
HOMEBREW_PREFIX: /usr/local
HOMEBREW_BOTTLE_DOMAIN: https://mirrors.ustc.edu.cn/homebrew-bottles
HOMEBREW_CASK_OPTS: []
HOMEBREW_EDITOR: subl -w
HOMEBREW_MAKE_JOBS: 4
Homebrew Ruby: 2.6.8 => /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby
CPU: quad-core 64-bit kabylake
Clang: 13.1.6 build 1316
Git: 2.32.1 => /Library/Developer/CommandLineTools/usr/bin/git
Curl: 7.77.0 => /usr/bin/curl
macOS: 12.0.1-x86_64
CLT: 13.4.0.0.1.1651278267
Xcode: N/A
Part3: Homebrew的常用语法及含义
有了Homebrew,接下来让我们一起来看一下Homebrew的常用操作命令吧。
操作 | 命令 |
---|---|
更新Homebrew | brew update |
更新所有安装过的软件包 | brew upgrade |
更新指定的软件包 | brew upgrade python |
查找软件包 | brew search python |
安装软件包 | brew install python |
卸载软件包 | brew remove python |
列出已安装的软件包 | brew list |
列出可更新的软件包 | brew outdated |
查看软件包的信息 | brew info python |
查看软件包的依赖信息 | brew deps python |
查看或编辑Formula脚本 | brew edit python@3.6 |
清理系统中所有软件的历史版本 | brew cleanup |
清理系统中指定软件的历史版本 | brew cleanup [软件名] |
检查Homebrew环境,并进行相应的修复 | brew doctor |
根据Formula脚本生成bottle文件 | brew bottle python@3.6 |
安装带图形界面的软件 | brew cask install [软件名] |
添加其他的软件下载地址 | brew tap [user/repo] |
Part4:积土为山
在本部分中,我将对配置和使用Homebrew过程中用到的一些好玩、高效的tricks做一些简单介绍,希望能够帮大家更好的去应用Homebrew。
4.1 将Homebrew的文本编辑器设置为Sublime Text
虽然阿柒并不排斥直接在终端里使用vi编辑器修改文本,但比起千篇一律的文本行和只能上下左右移动的光标,我还是更喜欢Sublime Text里高亮的文本展示以及随心所欲的在触控板上移动光标的feel~于是,借着这次机会,我便对我终端的文本编辑器进行了一次统一的升级,以后再要编辑文本的时候,就都可以在ST(Sublime Text)中轻松完成啦!这里照搬国外某大神在SO论坛里的高赞回答,三步搞定!
1.首先,在你的终端里随便打开一个文件夹,并在此处尝试打开你的ST;
/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl .
注意:此步至关重要!如果你的ST无法在当前指定的文件夹中打开,那么相应的,后面的步骤也将无法生效。你可以依照你的ST在Applications文件夹中的文件名,将命令行中的“Sublime\ Text.app”替换为“Sublime\ Text\ 2.app”或者“Sublime\ Text\ 3.app”。下图是阿柒的ST在电脑中的存储名:
2.接下来,就是要在你的环境变量(PATH)中创建符号链接。不过在那之前,我们还需要通过编辑~/.bash_profile,保证subl在命令行中代表ST;
export PATH=/bin:/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:$PATH
export EDITOR='subl -w'
其中,第一行设置了终端查找的环境变量路径的位置,鉴于最终阿柒的符号链接放在了“usr/local/bin”路径下。当然啦,只要能对应起来,其实你是可以把符号链接放在任何一个路径下的;第二行其实是可以省略的,写在这里的目的仅是为了将命令行文本编辑器默认设置为ST。-w是ST的配置参数之一,表示wait for the files to be closed before returning,即在我们主动关闭所编辑的文件之前,ST将一直保持打开状态,是最符合我们日常编辑操作的参数。更多参数可以参考Sublime Text DOC。
3.最后就是创建ST的符号链接了~
ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl
现在,当你想要在命令行中使用ST编辑某个文件时,只需输入下面的命令即可。
subl [你想要编辑的文件名]
特别的,当我们使用brew edit编辑查看某个安装公式时,同样的我们也可以使用类似的方法将编辑器替换成ST。即在~/.bash_profile中添加以下内容:
export HOMEBREW_EDITOR='subl -w'
4.2 当命令行报错:Permission denied
举个例子,当我要用下面这段IP地址替换某段网址时,我的命令行是这样写的:
sudo echo "182.xx.124.6 raw.githubusercontent.com" >> /etc/hosts
当然了,不出意外的获得了如下的结果:
-bash: /etc/hosts: Permission denied
阿柒经过实践和查阅资料获知,出现Permission denied这种情况一般是由于两部分原因,即:1.用户权限不足;2.文件权限不足。
于是用排除法即可解决问题——已知用户已获得超级用户(root)权限,系统仍然报错:Permission denied,那原因只可能是:/etc/hosts文件权限不足。因此我们可以使用下列语句对文件权限进行修改:
sudo chmod -R 777 /etc/hosts
其中,chmod即change mode,修改文件权限。注意⚠️:只有文件的所有者和超级用户可以对权限进行修改,因此chmod前常与sudo配合使用。-R表示级联应用到目录中的所有子目录和文件,777表示所有用户都拥有最高权限。
当然啦,同样的目标我们也可以通过下面的语句来实现:
sudo chmod a+w /etc/hosts
这是因为,a表示所有用户组,包括root用户组、文件拥有者用户组和其他用户组。而“+”表示添加权限,“x”表示执行权限,“r”表示阅读权限,“w”表示写入权限。
4.3 详解环境变量
4.3.1 你真的知道环境变量吗?
4.3.2 $PATH中各路径顺序
4.3.3 alias与环境变量的关系
4.4 Mac终端的显示配置
Part5:只道寻常
一、千变万化命令行
二、-R级联是如何实现的
三、指定文件权限的两种模式:绝对模式(八进制数字模式)、符号模式分别是什么
四、文件的权限都包括什么,又是如何排序的
五、详解用户组
六、为什么需要符号链接
七、镜像源
对于我们时常在项目搭建的过程中使用到的镜像源,不知道大家有没有好奇过它究竟是个什么东西😂,在此阿柒先将一个比较常见的镜像源镇上来,请大家一睹尊容💁
🔗USTC Mirror Help