Wie entferne ich eine Gruppe nicht mehr benötigter Debian-Pakete?

7

Beim Erstellen von Software muss ich manchmal Bibliotheken, Binärdateien usw. installieren, die nur zum Erstellen des Pakets erforderlich sind, aber dann vergesse ich, sie zu entfernen, sodass ich nicht mehr mehrere Pakete gleichzeitig bereinigen muss. sogar die, die ich nicht entfernen möchte.

Das Parsen der Protokolldateien, um die genauen Pakete zu finden, ist suboptimal und ein königlicher Schmerz, wenn die Pakete alt genug sind. Gibt es eine Möglichkeit, diese Aufgabe zu erleichtern?

Braiam
quelle
Ich nehme an, Sie sprechen von Paketen, die dabei installiert werden (zum Beispiel) apt-get build-dep ..., oder? Ich denke, apt markiert diese nicht standardmäßig als automatisch installiert, obwohl eine Option dazu nützlich sein könnte, da sie nur für kurze Zeit benötigt werden. apt scheint die Option zu haben, zu sagen, dass "alle diese Pakete, die ich jetzt installiere, automatisch installiert werden", aber wenn dies der Fall ist, könnte dies hier nützlich sein.
Faheem Mitha
Ähnliche askubuntu.com/q/180504/15729
Faheem Mitha
Im ersten Kommentar wollte ich schreiben "apt scheint nicht ..."
Faheem Mitha
@FaheemMitha nicht nur für build-dep(durch das Beispiel wurde hauptsächlich darauf fokussiert), weil ich mit einigen Projekten arbeite, die nicht in den Repositories enthalten sind.
Braiam

Antworten:

6

Ich würde vorschlagen, Benutzer-Tags zu verwenden, was ein Merkmal von aptitude ist (apt binary hat dies nicht), würde dabei helfen. Fügen Sie bei der Installation von Paketen die --add-user-tagOption hinzu, wenn Sie die Pakete installieren, zum Beispiel:

sudo aptitude --add-user-tag build-dep-package build-dep package

und um sie zu entfernen, verwenden Sie einfach:

sudo aptitude remove '?user-tag(build-dep-package)'

Sie können das Tag auch unterwegs mit entfernen --remove-user-tag build-dep-package.

Dies ist jedoch ein Problem. Was ist, wenn dasselbe Paket beide Tags enthält? Nun, Sie verwenden nur die und / oder nicht die Bedingungen, um dies zu verhindern:

sudo aptitude remove '?and(?user-tag(build-dep-package),?not(?user-tag(wanted-packages))'

Um mehrere Pakete mit unterschiedlichen Tags zu bearbeiten, verwenden Sie oder:

sudo aptitude remove '?or(?user-tag(build-dep-package),?user-tag(wanted-packages)'

Dies ist auf lange Sicht sehr nützlich. Ich habe keine Möglichkeit gefunden, alle derzeit aktiven Tags aufzulisten.

Braiam
quelle
3

Ich habe einen Beitrag von David Kalnischkies im Blog-Beitrag UNDO APT-GET BUILD-DEP (BUILD DEPENDENCIES ENTFERNEN) gefunden.

Für diejenigen, die es nicht wissen, ist David der Hauptbetreuer, und das seit 2009 oder so ungefähr. Es ist also eine sichere Wette, dass er weiß, wovon er spricht.

DonKult • vor 3 Jahren

Bevor Sie diese verrückte Befehlszeile ausprobieren, versuchen Sie diese Option: APT :: Get :: Build-Dep-Automatic

wie in apt-get build-dep -o APT :: Get :: Build-Dep-Automatic = true srcpkg1 srcpkg2…

Wenn das für Sie funktioniert und Sie es dauerhaft haben möchten: echo APT :: Get :: Build-Dep-Automatic "true"; > /etc/apt/apt.conf.d/99markbuilddepauto

Ich erinnere mich nicht, in welcher APT-Version es hinzugefügt wurde, aber es muss alt genug für mindestens ein paar Ubuntu-Releases sein… Übrigens: Der Standardwert wurde am 09.02.2009 in Ubuntu auf "false" geändert.

Oh, und nur zur Veranschaulichung: Wahnsinnig, weil es die Fähigkeit installiert, dieselbe Funktionalität zu verwenden, die bereits von einer installierten Anwendung bereitgestellt wird, die mit APT: apt-mark geliefert wird.

Aber wie immer können Sie mit 6 Stunden Codierung vermeiden, die Manpages 5 Minuten lang zu lesen…

Damit,

apt-get build-dep -o APT::Get::Build-Dep-Automatic=true srcpkg1 srcpkg2...

ist wahrscheinlich ein vernünftiger Weg. Ich hatte keine Ahnung, dass diese Option existiert. Bis jetzt konnte ich es nicht in einer passenden Dokumentation finden. Ich werde aktualisieren, wenn ich es tue.

Beachten Sie jedoch auch die Eignung für Debian-Fehlerberichte : APT :: Get :: Build-Dep-Automatic wird nicht berücksichtigt . Der Titel sagt alles.

UPDATE: Nachdem dies getestet wurde, scheint es nicht zu funktionieren. Ich tat

# apt-get build-dep -o APT::Get::Build-Dep-Automatic=true g++

und dann

# apt-get autoremove

aber es gab nichts zurück. Vielleicht fehlt mir etwas. Ich werde diese Antwort für den Moment in Ruhe lassen.

UPDATE 2: Ich sehe darin, /var/lib/apt/extended_statesdass die Pakete korrekt als gekennzeichnet sind Auto-Installed: 1. Also muss ich autoremovefalsch verwenden.

UPDATE 3: Versucht

# apt-get build-dep -o APT::Get::Build-Dep-Automatic=true coreutils

und dieses Mal

# apt-get autoremove

dh-buildinfo gperf libacl1-dev libattr1-devkorrekt deinstalliert .

Warum hat der vorherige Versuch nicht funktioniert? Ich bin nicht sicher, aber Hypothese - die Pakete der obersten Ebene lieferten virtuelle Pakete, die für manuell installierte Pakete erforderlich waren. Damit

gcj-jre-headless

Provides: java-gcj-compat-headless, java-runtime-headless, java-virtual-machine, java1-runtime-headless, java2-runtime-headless, java5-runtime-headless

und

ant

Depends: default-jre-headless | java5-runtime-headless | java6-runtime-headless | java7-runtime-headless, libxerces2-java

Hier gibt es also eine Überlappung - nämlich java5-runtime-headless. Fazit - dies könnte ein leider ausgewähltes Beispiel gewesen sein.

Faheem Mitha
quelle
3

Dies hilft nicht bei Ihren vorhandenen Entwicklungspaketen, aber für die zukünftige Verwendung sollten Sie mk-build-deps(im devscriptsPaket) verwenden, um ein Metapaket für die Abhängigkeiten zu generieren.

mk-build-depsbenötigt nur den Namen eines verfügbaren Pakets oder dessen Steuerdatei. Letzteres ist nützlich, wenn Ihr Paket (noch) nicht verfügbar ist oder wenn Sie neue Abhängigkeiten hinzufügen.

Es kann das generierte Metapaket (plus Abhängigkeiten) für Sie installieren, wenn Sie möchten.

Wie üblich, alle Details auf der Handbuchseite, sobald Sie es installiert haben.

Toby Speight
quelle