„Ich habe ein Paket installiert, aber kann es nicht löschen!“ – Kommt dir das bekannt vor?
\n\nDu lernst gerade Go, findest eine coole Bibliothek auf GitHub, tippst go get github.com/example/package – und alles funktioniert! Doch mit der Zeit ändert sich dein Projekt und du stellst fest: Dieses Paket wird nicht mehr benötigt. Du suchst nach einem Befehl wie go remove oder go uninstall, aber... den gibt es einfach nicht.
Willkommen in der Welt von Go, wo das Entfernen von Paketen kein Knopfdruck, sondern ein kleines Abenteuer ist. In diesem Artikel schauen wir uns an, wohin Pakete nach go get landen, wie du sie richtig „ausquartierst“ und warum Go das so gemacht hat. Spoiler: Nach dem Lesen wirst du keine Angst mehr vor Systemmüll haben und deine Projekte sauber halten können.
Wie funktioniert go get? Eine kurze Einführung
\n\nBevor wir löschen, lass uns verstehen, wohin das Paket genau geht. In Go (vor Version 1.16, aber dieses Wissen ist immer noch relevant) hat der Befehl go get den Quellcode des Pakets in zwei Verzeichnisse heruntergeladen:
- \n
$GOPATH/src– der Quellcode des Pakets (als ob du das Repository geklont hättest); \n $GOPATH/pkg– die kompilierten Objektdateien (.a). \n
Wenn du Go Modules verwendest (seit Version 1.16 ist das der Standardmodus), funktioniert go get anders: Es fügt die Abhängigkeit zu go.mod hinzu und lädt das Modul in den Cache ($GOPATH/pkg/mod).
Das Problem ist, dass es in Go keinen eingebauten Befehl zum „Paket löschen“ gibt. Die Sprachentwickler sind der Meinung: Wenn du ein Paket nicht mehr brauchst, importiere es einfach nicht mehr in deinem Code. Klingt logisch, aber was ist, wenn du Speicherplatz freigeben oder Ordnung schaffen willst?
\n\nMethode 1: go clean -i (für alte Projekte ohne Module)
\n\nFrüher (vor der Modul-Ära) gab es den Befehl go clean -i. Er entfernte die kompilierten Dateien des Pakets aus $GOPATH/pkg. Aber die Quelldateien blieben unberührt. Du hast also nur die binären Artefakte gelöscht, der Code selbst blieb in src erhalten.
# Entfernt die kompilierten Dateien des Pakets\ngo clean -i github.com/example/package\n\n# Die Quelldateien sind immer noch da:\nls $GOPATH/src/github.com/example/package\n\nIn der Praxis war das umständlich. Deshalb ist go clean -i in modernen Go-Versionen (ab 1.12) als veraltet markiert. Wenn du heute go clean -i ausführst, ignoriert Go einfach das Flag -i und führt ein normales go clean aus (Löschen von Objektdateien im aktuellen Projekt).
Methode 2: Manuelle Löschung aus GOPATH (für Veteranen)
\n\nWenn du immer noch ohne Module arbeitest (oder einfach alte Hinterlassenschaften bereinigen willst), musst du selbst Hand anlegen. Hier ist das vollständige Rezept:
\n\n- \n
- Finde heraus, wo dein
$GOPATHliegt: \n
go env GOPATH\n\nNormalerweise ist das /home/benutzer/go oder C:\\Users\\benutzer\\go.
- \n
- Lösche die Quelldateien: \n
rm -rf $GOPATH/src/github.com/example/package\n\n- \n
- Lösche die kompilierten Dateien (falls vorhanden): \n
rm -rf $GOPATH/pkg/linux_amd64/github.com/example/package.a\n\n\n\n\nWichtig: Der Pfad zur
\n.a-Datei hängt von deinem Betriebssystem und deiner Architektur ab.linux_amd64ist ein typisches Beispiel. Den genauen Pfad findest du mitgo list -m, aber einfacher ist es, einfach den gesamten Paketordner inpkgzu löschen.
Diese Methode funktioniert, ist aber unsauber. Du riskierst, versehentlich etwas Wichtiges zu löschen. Außerdem: Wenn das Paket in anderen Projekten verwendet wurde, werden diese kaputtgehen.
\n\nMethode 3: Der moderne Ansatz – go mod tidy
\n\nWenn du Go Modules verwendest (und das solltest du, wenn du 2024 mit dem Lernen beginnst), ist alles viel eleganter. Sobald du ein Paket nicht mehr in deinem Code importierst, wird es automatisch nicht mehr benö