Wie kann ich MacPorts zwingen, alle aktualisierbaren Ports zu aktualisieren, die es kann?

Angenommen, ich habe veraltete Ports A, B, C, D, E, F und G. Nehmen Sie der Einfachheit halber an, dass alle "angefordert" sind.

  • A hat keine Abhängigkeiten.
  • B hängt direkt von C und D und E ab.
  • C hängt direkt von E und F ab.
  • D hat keine Abhängigkeiten.
  • E hat keine Abhängigkeiten.
  • F hat keine Abhängigkeiten.
  • G hat keine Abhängigkeiten.

Nach meinem besten Verständnis installiert MacPorts, wenn es ausgeführt wird ( sudo port upgrade outdated), die Ports in einem Abhängigkeitsbaum, der in alphabetischer Reihenfolge sortiert ist. Es würde also die Ports in dieser Reihenfolge installieren: A, D, E, F, C, B.

Angenommen, Port A ist defekt. MacPorts beendet die Installation.

Ich sehe dies als eine Unannehmlichkeit an, da die anderen veralteten Ports sehr gut funktionieren könnten. Die Tatsache, dass A nicht installiert wird, hat keine Auswirkungen auf die anderen Ports. Da nun ein einzelner Port nicht installiert werden kann, sind alle anderen meiner Ports veraltet, bis dieser Port behoben ist.

Meine Frage:

Wie kann ich MacPorts anweisen, mit der Installation aller installierbaren Ports fortzufahren, die ohne Fehler installiert werden können?

Dies ist wahrscheinlich im Geiste dasselbe wie dieses : MacPorts: Installation anderer Updates nach Fehler fortsetzen . Ich kaufe die Antworten auf dieser Seite jedoch nicht:

  • Der MacPorts-Entwickler (@ClemensLang) sagt, dass es einen Grund gibt, warum MacPorts nicht fortgeführt wird. (Die Links, die er enthält, unterstützen dies, aber es wird mir zu technisch. Entschuldigung!) In meinem obigen Fall scheint die Installation von Port G nach dem Ausfall von Port A kein Problem zu sein. (... oder doch?) Gibt es eine sichere Möglichkeit?
  • Die -pFlagge ist offensichtlich problematisch. Ich hätte gedacht, dass dies die Antwort auf diese Lösung wäre, aber mehrere Entwickler warnen Benutzer davor, es zu verwenden, es sei denn, sie verstehen wirklich, was es tut. Ich gehe lieber auf Nummer sicher.
  • Ich könnte es versuchen sudo port upgrade outdated and not A. Dies funktioniert, wenn nur ein unabhängiger Port ausfällt, aber was ist, wenn zwei oder drei Ports (von Dutzenden) ausfallen? Könnte ich so etwas tun sudo port upgrade outdated and not A and not C and not E(etc.)?

Angenommen, es gibt zu viele Ports, die sie nicht einzeln ausschließen können. Nehmen Sie auch an, dass es zu viele Ports gibt, um sie einzeln zu aktualisieren.

Es gibt einen Weg, aber niemand hat die Arbeit dafür geleistet. Macpoirts hätte gerne Korrekturen dafür. Wie Clemens sagte, es kann manuell gemacht werden, Sie müssen dies nur automatisieren - aber niemand, der die Details von Macports kennt, glaubt, dass es sich lohnt Zeit damit verbringen, da sie andere Dinge zu tun haben,
Der Weg zur Installation von Port G ist Port Install G oder Port Update G
@Markus: Danke. Beachten Sie jedoch die letzten beiden Zeilen: "Angenommen, es gibt zu viele Ports, die sie nicht einzeln ausschließen können. Angenommen, es gibt auch zu viele Ports, um sie einzeln zu aktualisieren."
Nun, das sollte -p tun - aber es könnte nicht funktionieren - wenn Sie Macports debuggen können, werden Sie sehen, ob es gut funktioniert hat - niemand in der Macports-Entwicklung hat genügend Tests durchgeführt, um zu sagen, dass es funktionieren wird, es könnte oder vielleicht nicht

Antworten (1)

Das ist, was ich benutze ... es ist vielleicht nicht schön, aber es funktioniert:

sudo bash -c 'for port in `port outdated  2>/dev/null |  tail -n +2 | awk '\''{print $1}'\''` ; do echo -n "$port:" ;  port -N upgrade $port 2>> /tmp/upgrade-ports.err >> /tmp/upgrade-ports.out && echo "✓" || echo "✕" ; done'

Lassen Sie es mich für Sie herunterbrechen:

  • Erstens möchten Sie sudo nicht in einer Schleife ausführen, da Sie sonst Ihr Passwort eingeben müssen. Um sudo zu vermeiden, habe ich die gesamte Schleife erhalten und sie in Anführungszeichen gesetzt (Alt+' in zsh ist sehr hilfreich, um die vorhandenen Anführungszeichen richtig zu umgehen) und sie dann mit ausgeführt sudo bash -c. Alternativ kann man es auch in eine Datei packen und als Skript damit ausführensudo script

  • das lässt uns mit dieser Schleife:

for port in `port outdated  2>/dev/null | tail -n +2 | awk '{print $1}'` ; do echo -n "$port:" ;  port -N upgrade $port 2>> /tmp/upgrade-ports.err >> /tmp/upgrade-ports.out && echo "✓" || echo "✕" ; done```
  • Ich erstelle die Liste der Ports mit: port outdated 2>/dev/null | tail -n +2 | awk '{print $1}'(Tail entfernt die Zeile „Folgende installierte Ports sind veraltet:“)
  • für jeden port drucke ich den portnamen und ein semikolon (ohne newline )
  • dann versuche ich, es nicht interaktiv zu aktualisieren und die Ausgabe und die Fehler zu speichern
  • Wenn das Upgrade erfolgreich war, drucke ich ein "✓" und einen Zeilenumbruch, andernfalls ein "✕" und einen Zeilenumbruch
  • Beachten Sie, dass die installierten Abhängigkeiten nicht angezeigt werden, aber Sie können das Protokoll verfolgen, um zu sehen, was passiert *
  • so sieht die Ausgabe aus:
adwaita-icon-theme:✓
apr:✕
aquaterm:✓

HTH

* Zur Verdeutlichung bearbeitet. Das bedeutet, dass die Ausgabe in Ihrem Beispiel so aussehen würde:

A:✕
B:✓
C:✓
D:✓
E:✓
F:✓
G:✓

Aber B wird lange dauern und C, D, E und F werden sehr schnell sein, weil sie bereits während B aktualisiert wurden.