5 Homebrew
If you’re setting up a Mac for development, Homebrew (https://brew.sh) is an absolute must. Installing Homebrew is one of the first things I do after firing up a new computer:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
As they describe it on their site:
Homebrew installs the stuff you need that Apple (or your Linux system) didn’t.
Until my (as of this writing) most recent computer setup, my mental model for what to install with Homebrew was restricted to the packages in Homebrew Core—its default formulae (packages) that can be installed through its default “tap” (i.e. by using brew install <formula>
). But, this time around, my approach was something akin to Homebrew all the things!
5.1 How to install macOS apps with Homebrew
Y’know how you used to have to download apps from their websites, and drag them to the application folder or whatever? Yeah—turns out you can do pretty much all of that using Homebrew Cask.
The general format for casks/apps available from Homebrew’s cask tap is: brew install –-cask <cask-name>
. For example, instead of downloading the Alfred app from its site, you can run the following in your terminal:
brew install --cask alfred
Homebrew’s cask tap provides “a friendly CLI workflow for the administration of macOS applications distributed as binaries.”
5.2 How to install fonts with Homebrew
This one damn near blew my mind: Yes, you can install fonts with Homebrew! Like installing macOS apps (Section 5.1), fonts are Homebrew casks (they live in Homebrew’s homebrew-cask-fonts repo). The first time you do this you will have to tap
this collection of cask
s.1 To do so you’ll run the following:
brew tap homebrew/cask-fonts
Once you’ve done that, the “tap” is there for your future use, and you won’t have to run that command again. To install individual fonts, you’ll follow the brew install --cask <NAME OF THING HERE>
you used for macOS apps. The font names are prefixed with font-
. For example, to install Roboto, you’d run:
brew install --cask font-roboto
What fonts are in there? I don’t have an exhaustive list on hand, but the answer is a lot (just shy of 1,900 font casks in the directory as of this writing)! I’m pretty sure everything from Google Fonts is there, as are the Nerd Fonts. You can peruse available fonts with brew search font-
. However, I usually just give installing the font with homebrew a try, and go from there.
Much advice adapted from Install fonts on your Mac from the command line with Homebrew by M. Scott Ford.
5.3 How to have multiple installations of Homebrew
Homebrew works great with the Apple Silicon—i.e. newer Macs with arm64 processors—and gets installed natively to /opt/homebrew
. However, there are some tools and applications that don’t yet support the arm64 architecture, and need Apple’s Rosetta (a translation environment) to follow the x86_64 instructions (i.e. the ones for the Intel architecture).
If it’s a whole application that needs to be run using x86, you can just select “Open using Rosetta” in the application’s info pane2, and move on your merry way. However, things get a little bit trickier if you’re dealing with something like a CLI tool (in my case, the Heroku CLI). 3 Hopefully this problem will soon be a thing of the past, but (for now) one way to address it is by having a second installation of Homebrew (an “Intel-emulated” version) on your machine that you run in a terminal using Rosetta .
This answer to “How can I run two isolated installations of Homebrew?” by Jacob Ford is quite complete, and worked perfectly for me. I’m basically repeating it here so I don’t forget what my setup is.
My starting assumptions are that you already have Rosetta and native (ARM) Homebrew installed, and that Homebrew is in its default location (/opt/homebrew
).4
In a terminal run using Rosetta, install the Intel-emulated Homebrew to its default /usr/local
:
arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Create an alias for this version of homebrew in your ~/.zshrc
.5
alias oldbrew='arch --x86_64 /usr/local/Homebrew/bin/brew'
Make sure that the native Apple Silicon Homebrew is used by default by prepending it to your PATH
. To do so add the following to your ~/.zshrc
:
path=('/opt/homebrew/bin' $path)
export PATH
Confirm that things worked by running which brew
and then which oldbrew
(or whatever alias you used), which should return the paths I’ve commented out below:
which brew
# /opt/homebrew/bin/brew
which oldbrew
# oldbrew: aliased to arch --x86_64 /usr/local/Homebrew/bin/brew
Alternately, you can confirm by running:
brew --prefix
(which should return/opt/homebrew
), and
oldbrew --prefix
(which should return/usr/local
).
Because the native Homebrew comes first in your PATH
, it will be used by default for commands that exist in both installations of Homebrew unless you specify that PATH=/usr/local/bin
for the command. To make this easier, add another alias to your ~/.zshrc
(I used Ford’s recommended ib
, to stand for “Intel brew”), which you can then prepend to any Homebrew command to force it to use the Intel version.
alias ib='PATH=/usr/local/bin'
You can confirm that this worked by running ib which brew
, which should return /usr/local/bin/brew
.
Adapted from How can I run two isolated installations of Homebrew? answer by Jacob Ford.
5.4 How to install other stuff with Homebrew
In addition to Homebrew’s core formulae and casks, you can use Homebrew (i.e. the brew
command) to install other third-party formulae (i.e. fonts, applications, etc.) using tap
. The process is the same as the initial step of installing fonts with Homebrew (Section 5.2), since the fonts cask isn’t “on tap” by default. You add a new tap by running brew tap <user/repo>
, and can then use brew install
for the added formula.
Take, for example, Patrick Schratz’ rcli
tool, which allows you to easily install and switch between multiple versions of R. The rcli
installation instructions recommend the following for macOS:
brew tap pat-s/rcli
brew install rcli
In the first step, you’re adding the new tap, and, in the second, you’re installing rcli from that tap.
To remove an entire tap, you can run brew untap <user/repo>
.
For details, see Homebrew Documentation - Taps.
5.5 How to unlink a Homebrew cask
I keep my Homebrew formulae and casks aggressively updated.6 However, there are some applications (which, as described in Section 5.1, are installed as casks) that I’d like to manage manually. For a regular, non-cask formula, you can use brew unlink <formula>
to remove the formula from Homebrew’s prefix. However, as of this writing, this command doesn’t work for Homebrew Cask.
To un-link an app from brew
(i.e., tell Homebrew to forget an app), you need to manually remove the application folder from the Homebrew Caskroom. For an Intel Mac, this is located at /usr/local/Caskroom
, whereas the Caskroom is at /opt/homebrew/Caskroom
for ARM.
You can make sure that the cask is gone by listing your installed casks with:
brew list --cask
Adapted from response to Unlink app from brew cask originally written by maP1E bluE and updated by nohillside.
I may be messing up the beer-metaphor terminology here, but, don’t worry, the actual code syntax is correct.↩︎
See Apple Support article on installing and using Rosetta for details.↩︎
For instructions specific to using the Heroku CLI with Rosetta, see Beppe Catanese’s Deploy to Heroku From a MacBook M1: Heroku CLI or GitHubActions.↩︎
If this is not the case, see Jacob Ford’s answer to the aforementioned question, which explains how to do both.↩︎
I went verbose, and called mine
oldbrew
, since I didn’t trust myself with the one-letter difference betweenbrew
andbrow
Ford used in his answer.↩︎If you use Oh My Zsh, the brew plugin has some helpful aliases, including
bubu
(which updates Homebrew data, upgrades outdated formulae and casks, and runs cleanup).↩︎