Homebrew

From Segfault
Jump to: navigation, search

Installation

Homebrew likes to install to /usr/local[1], but one can specify any other directory:

curl -OL https://raw.githubusercontent.com/Homebrew/install/master/install

Adjust the install file:

HOMEBREW_PREFIX = '/opt/homebrew'
[...]
abort <<-EOABORT unless `groups`.split.include? "staff"

Execute the install script:

$ ruby ./install
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/Library/...
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/sbin/chown sue /Library/Caches/Homebrew
==> /usr/bin/sudo /usr/bin/chgrp admin /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 461, done.
remote: Compressing objects: 100% (419/419), done.
remote: Total 461 (delta 28), reused 292 (delta 17), pack-reused 0
Receiving objects: 100% (461/461), 761.55 KiB | 573.00 KiB/s, done.
Resolving deltas: 100% (28/28), done.
From https://github.com/Homebrew/brew
 * [new branch]      master     -> origin/master
HEAD is now at 36b2af2 superenv: fix formula prefix path to consider revisions
==> Tapping homebrew/core
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Counting objects: 3660, done.
remote: Compressing objects: 100% (3545/3545), done.
remote: Total 3660 (delta 17), reused 446 (delta 3), pack-reused 0
Receiving objects: 100% (3660/3660), 2.75 MiB | 1.62 MiB/s, done.
Resolving deltas: 100% (17/17), done.
Checking connectivity... done.
Tapped 3535 formulae (3,686 files, 8.6M)
Warning: /opt/homebrew/bin is not in your PATH.
==> Installation successful!
==> Next steps
Run `brew help` to get started

Optionally lock down the installation directory:

sudo chown -R homebrew:homebrew /opt/homebrew/                        # Create a user first!

Adjust your PATH variable accordingly:

export PATH=$PATH:/opt/homebrew/bin

sudo

We may need special sudo rules for our homebrew user:

%staff  ALL=(homebrew:homebrew) NOPASSWD: /opt/homebrew/bin/brew
homebrew ALL=(ALL) NOPASSWD:SETENV: /usr/sbin/installer
  • This will allow all members of the staff group to execute brew as the user homebrew w/o providing a password.
  • The user homebrew may call the installer w/o providing a password, since we didn't set one. Also, the homebrew user will be allowed to preserve the environment.[2] The latter may be required for some bundles (e.g. VirtualBox).

ACL

Also, some brew bundles may want to create symlinks in /usr/bin/local and will fail when the homebrew user is not allowed to do so. Let's use ACLs to allow that:

sudo chmod +a "homebrew allow read,execute,add_file,delete_child" /usr/local/bin

Now we should have something like this:

$ ls -lde /usr/local/bin
drwxr-xr-x+ 30 root  wheel  1020 May 15 12:41 /usr/local/bin
0: user:homebrew allow list,add_file,search,delete_child

Usage

List available packages:

$ brew search | wc -l
3535

Update brew itself and all formulae:

$ sudo -H -u homebrew brew update
Updated Homebrew from 3dc4841 to cfef282.
Updated 2 taps (caskroom/cask, homebrew/versions).

Upgrade all packages:

sudo -H -u homebrew brew upgrade --cleanup

If the sudo calling is too cumbersome, try an alias:

$ alias brew="sudo -H -u homebrew /opt/homebrew/bin/brew"
$ set -x
$ brew update
+ sudo -H -u homebrew /opt/homebrew/bin/brew update
Already up-to-date.

Brew Bundle

  1. brew tap adds more GitHub repos to the list of available formulae.
  2. Homebrew Cask can be used to install (native) Mac applications.

Let's combine[3] them:

brew tap Homebrew/bundle

Now "brew bundle should work. We can use a Brewfile to list all the applications to install:

$ cat .Brewfile.local
cask_args appdir: '/Applications/BrewBundle'
# cask 'adium'
# cask 'audacity'
# cask 'burn'
# cask 'citrix-receiver'
# cask 'handbrake'
cask 'firefox'
# cask 'flux'
# cask 'google-chrome'
# cask 'libreoffice'
# cask 'microsoft-lync'
# cask 'osxfuse'
# cask 'picasa'
# cask 'skype'
# cask 'sshfs'
# cask 'steam'
# cask 'sqlitebrowser'
# cask 'soundflower'
# cask 'teamviewer'
cask 'thunderbird'
# cask 'tunnelblick'
cask 'virtualbox'
# cask 'vlc'

$ sudo mkdir -m 0755 -p /Applications/BrewBundle /opt/homebrew-cask
$ sudo chown homebrew:homebrew /Applications/BrewBundle /opt/homebrew-cask

Try to use the 'Brewfile now:

$ brew bundle --file=$HOME/.Brewfile.local
Succeeded in installing firefox
Succeeded in installing thunderbird
Succeeded in installing virtualbox
Success: 3 Fail: 0

We need to use Homebrew Cask to list the installed packages:

$ brew cask list
firefox      thunderbird  virtualbox

Upgrade

Upgrade all casks[4], as this isn't possible yet:[5][6]

brew cask list | xargs brew cask install --force

This doesn't work of course when Homebrew is installed as a different user. As xargs(1) doesn't recognize aliases[7], we may have to use a wrapper script after all:

$ cat /usr/local/bin/brew.sh
#!/bin/sh
sudo -H -u homebrew /usr/local/bin/brew $@

$ (brew.sh cask list | xargs brew.sh cask install --force) 2>&1 | tee ~/.log/brew-cask-upgrade.log

Bugs

Before reporting bugs, one could try to reset the Homebrew installation:

brew doctor

Annoying bugs, that were closed w/o a fix:

Uninstall

Uninstall Homebrew[8]:

curl -O https://raw.githubusercontent.com/Homebrew/install/master/uninstall
ruby ./uninstall

Links

References