Homebrew

Homebrew

Nachdem jetzt Homebrew auch für die neuen M Macs mit ARM basierten Apple-Silikon zur Verfügung steht, Zeit für einen kleinen Homebrew-Guide in deutsch.

Was ist Homebrew und wofür brauche ich das

Das ist wohl eine der wichtigsten Fragen. Homebrew ist ein Paketmanager für die Kommandozeile zur Installation von Open-Source Anwendungen auf macOS. Linux Benutzer kennen diese Paketmanager, aber auf macOS fehlen diese Standards leider nativ. Wer sich jetzt noch nicht über bestimmte fehlende Anwendungen wie z.B. wget auf seinem Mac gewundert hat, hat wahrscheinlich auch keinen Bedarf für einen Paketmanager wie Homebrew. Allen anderen möchte ich hier einmal zeigen was geht und vor allem wie es geht.

Installation von Homebrew

Die Installation erfolgt natürlich, wie sollte es auch anders sein, im Terminal (also der CLI von macOS). Dazu öffnen wir die Terminal App und geben folgendes Kommando ein:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Das Kommando macht nichts weiter als ein Installations-Script von Github herunterzuladen und auszuführen. Das Skript selbst installiert Homebrew unter dem bevorzugten Präfix (/usr/local für Intel, /opt/homebrew für Apple Silicon), so wird bei der Verwendung von homebrew kein Sudo benötigt. Es kann auch dann ausgeführt werden, wenn in /usr/local bereits Inhalte installiert sind. Während der Ausführung wird jeder Schritt erläutern und muss bestätigt werden bevor Änderungen vorgenommen werden.

Noch etwas zu den Systemvoraussetzungen. Homebrew benötigt einen 64-bit Intel CPU oder natürlich eine Apple Silicon CPU, mindestens macOS Mojave (10.14) und die installierten Xcode Command Line Tools (CLT) die wie folgt installiert werden können:

xcode-select --install

Wer Homebrew wider Erwarten nicht mag und wieder von seinem System entfernen möchte, macht das wie bei der Installation mit einem Script:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"

Übrigens, beide Scripte liefern uns mit dem --help Schalter weitere Install bzw. Uninstall Optionen.

Installation von Paketen

Nachdem Homebrew nun installiert ist, können wir auch schon die ersten Pakete installieren. Tatsächlich ist das nun genauso simpel wie unter Linux. Kommen wir zurück zu dem oben genannten Beispiel mit wget. wget ist eine Befehlszeilenanwendung zum Herunterladen von Ressourcen über die URL. Im Vergleich zu curl, das mit macOS geliefert wird und wir ja für die Installation von Homebrew verwenden, ist wget nicht interaktiv und kann im Gegensatz zu curl auch Hintergrund ausgeführt werden. Die Installation erfolgt mit:

brew install wget

brew install

Wie im Screenshot zu sehen, wird nicht nur wget selbst, sondern auch die erforderlichen Abhängigkeiten gleich mit installiert. Mehr zum Thema Abhängigkeiten folgen später noch.

Selbstverständlich können wir wget auch, wie viele andere Anwendungen, ohne Homebrew installieren. Exemplarisch hier mal die erforderlichen Schritte (wobei das nur wget installiert, um die Abhängigkeiten müssen wir uns selbst kümmern):

1. Installation der Xcode Tools

xcode-select --install

2. wget Sourcen mit curl runterladen

curl -O https://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz

3. Sourcen entpacken und konfigurieren

tar -zxvf wget-1.19.5.tar.gz 
cd wget-1.19.5/
./configure`

4. Ausführen von make und testen der Installation

make
make install
wget http://ftp.gnu.org/gnu/wget/wget-1.19.5.tar.gz

Das kann jetzt jeder beurteilen wie er möchte, aber ich verwende dann doch lieber brew install wget.

Welche Pakete sind bereits installiert

Irgendwann möchte man natürlich auch wissen, welche Pakete eigentlich installiert sind. Das geht genau so einfach mit dem folgenden Kommando:

brew list

brew list

Sollte es hier zu unübersichtlich werden, kann die Ausgabe auch in eine Text-Datei umgeleitet oder die Ausgabe mit *grep gefiltert werden.

brew list | grep jpeg
brew list > brewlist.txt

Selbstverständlich tauchen dort auch immer wieder mal Pakete auf, die wir nicht richtig zuordnen können oder die als Abhängigkeit mit einer anderen Installation auf unseren Mac gekommen sind. Hier kann es durchaus hilfreich sein, sich mal die Informationen eines Paketes anzuschauen:

brew info <paketname>

brew info paketname

Wer auch noch wissen möchte, wo das entsprechende Paket installiert wurde dem hilft das Kommando:

brew --prefix <paketname>

Standardmäßig werden alle Pakete in allen Versionen von macOS im Verzeichnis /usr/local/Cellar/installiert. Zusätzlich werden im Verzeichnis /usr/local/opt/ noch symbolische Links erzeugt, die uns bei dem Kommando --prefix angezeigt werden. Das ganze kann mit dem folgenden Kommando angezeigt werden:

ls -l /usr/local/opt/
ls -l /usr/local/Cellar

Symlinks anzeigen

Wie unter UX Systemen üblich, kann eine Anwendung auch diverse Abhängigkeiten (engl. dependencies) mit installieren. Um sich diese deps in einer “schönen” Übersicht anzeigen zu lassen, gibt es das folgende Kommando:

# Für alle installierten Pakete (sehr unübersichtlich)
brew deps --tree --installed

# Für ein bestimmtes Paket
brew deps --tree <paketname> 
thomas@Toms-MBP ~ % brew deps --tree --installed
azure-cli
├── openssl@3
│   └── ca-certificates
└── python@3.10
    ├── gdbm
    ├── mpdecimal
    ├── openssl@3
    │   └── ca-certificates
    ├── readline
    ├── sqlite
    │   └── readline
    └── xz

bat
├── libgit2@1.5
│   ├── libssh2
│   │   └── openssl@3
│   │       └── ca-certificates
│   └── openssl@3
│       └── ca-certificates
└── oniguruma

...

Wer es gern grafisch mag, kann auch mal das folgende Kommando versuchen:

brew deps --graph --installed
brew deps --graph <paketname>

Grafische Ausgabe der Dependencie von wgets

Update, Upgrade

Natürlich muss sowohl Homebrew als auch unsere installierten Pakete irgendwann mal aktualisiert werden. Im Fall von Homebrew machen wir das mit dem Kommando:

brew update

Was die Pakete angeht, könnte die Information welche Pakete überhaupt ein Update benötigen, ganz interessant sein. Dies überprüfen wir mit dem folgenden Kommando:

brew outdated

Danach können wir ein einzelnes Paket aktualisieren:

brew upgrade <paketname>

oder natürlich gleich alle aktualisieren:

brew upgrade

brew upgrade

Wie finden wir Pakete zum installieren

Natürlich wollen wir auch neue Pakete installieren und dazu müssen wir natürlich wissen, welche es gibt. Auf der Kommandozeile geht das über eine einfach suche:

brew search <search_string>

Wenn wir zum Beispiel nach allem was für Azure verfügbar ist suchen, verwenden wir folgendes:

brew search azure

brew search

In der Ausgabe sehen wir alle Pakete die für Microsoft Azure (bzw. die „azure“ im Namen haben) verfügbar sind. Pakete mit einem grünen Häkchen in der Ausgabe sind übigens bereits installiert.

Kleiner Tip am Rande für alle die gern mit dem Mac arbeiten aber trotzdem Windows Systeme mit Powershell verwalten müssen. Über Homebrew lässt sich auch ganz hervorragend PowerShell Core auf dem Mac installieren und natürlich wie bei jedem anderen Paket auch aktualisieren und ggf. wieder entfernen.

brew install --cask powershell 

Mehr Informationen hier: Installing Powershell Core on macOS

Uninstall von Paketen

Natürlich wollen wir auch mal das eine oder andere Paket wieder deinstallieren. Das geht mit dem Kommando:

brew uninstall <paketname>

Interessant dabei sind auch die Abhängigkeiten, die meistens auch noch von anderen Paketen benötigt werden. Um jedoch Abhängigkeiten zu entfernen, die von keiner anderen Anwendung mehr verwendet werden, gibt es das folgende Kommando:

brew autoremove
brew autoremove --dry-run

Ich empfehle hier immer zuerst den Schalter --dry-run zu verwenden, denn bei allem was remove im Namen hat, bedeutet weg ist auch wirklich weg.

Das war jetzt erstmal nur eine kleine Einführung in das Thema Homebrew. Wer mehr wissen möchte, kann jederzeit die Dokumentation oder die Manpage (man brew) lesen und findet hier noch einige nützliche Links zum Thema.