Wie verwende ich meine eigene Version eines Standardpakets?

10

Ich bin auf ein Problem mit Nautilus gestoßen, für das ich keine andere Lösung gefunden habe, als den Quellcode herunterzuladen, einige Änderungen vorzunehmen und ihn selbst zu kompilieren. Jetzt habe ich zwei Versionen von Nautilus, die offizielle Version aus den Repositories und meine mit ein paar Änderungen. Ich möchte beides behalten.

Was wäre eine gute Möglichkeit, Anwendungen anzuweisen, meine eigene kompilierte Version von Nautilus zu verwenden, wenn Nautilus innerhalb der Anwendung gestartet wird? (zB Öffnen des Downloads-Ordners mit Firefox)

Ich habe herausgefunden, dass Firefox aufruft, /usr/bin/nautilusdamit ich dies einfach durch einen Symlink zu meinem eigenen Programm ersetzen kann. Ich glaube jedoch, dass dieser Symlink überschrieben wird, sobald ich ein Update für Nautilus installiere. Kann ich sonst noch etwas tun?


quelle
1
Das Einfügen Ihrer Version /usr/local/binhat nicht funktioniert? dh hat Firefox Ihre durchsucht $PATHund die Version in gefunden /usr/bin, oder ist es (oder Ihr xdg-offenes Zeug) Hardcode /usr/bin/nautilus? Die Installation einer eigenen Version von etwas in / usr / local funktioniert normalerweise.
Peter Cordes
Ich habe es gerade versucht und es hat nicht funktioniert. Ich weiß nicht, was Firefox intern tut, /usr/bin/nautilusscheint aber irgendwie fest codiert zu sein. Wenn es entfernt wird, macht Firefox nichts mehr, wenn ich versuche, den Download-Ordner zu öffnen, obwohl es einen Symlink zu meiner eigenen Version von Nautilus in gibt /usr/local/bin. Meine $PATHVariable ist/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Wenn Sie neugierig sind, können Sie laufen, um strace -f -efile,execve -o firefox_syscalls.txt firefoxzu sehen, was ff tut. Wenn Sie im Protokoll nach suchen nautilus, wird Ihnen möglicherweise etwas angezeigt. ( -eDadurch werden die Systemaufrufe gefiltert execveund Open / Close / Pfadnamen-Dateien abgelegt, andernfalls wäre dies eine Flut von futexLese- / Schreibvorgängen für X11.)
Peter Cordes

Antworten:

14

Ich würde die gepackte Version von Nautilus reparieren, was auf den ersten Blick entmutigend erscheinen mag, aber einfach genug ist - obwohl es Paket-Upgrades nicht überlebt, erfordert es etwas Disziplin. ( Einzelheiten finden Sie in Wouters Antwort .)

Der einfachste Ansatz in Ihrer Situation besteht darin, eine Ablenkung hinzuzufügen:

sudo dpkg-divert --divert /usr/bin/nautilus.original --rename /usr/bin/nautilus

Dies weist Sie dpkgan, umzubenennen /usr/bin/nautilus, /usr/bin/nautilus.originalwenn ein Paket versucht, es zu installieren. Dann können Sie Ihren eigenen Symlink hinzufügen, der auch nach dem Upgrade des Nautilus-Pakets unberührt bleibt. Führen Sie es aus, um es zu entfernen

sudo dpkg-divert --rename --remove /usr/bin/nautilus

Sie können dieselbe Technik auf jede andere Datei anwenden, die Sie auf ähnliche Weise ersetzen müssen, abgesehen von einigen Konfigurationsdateien, die beim Umleiten nicht korrekt behandelt werden.

Stephen Kitt
quelle
7

Die beste langfristige Lösung besteht darin, die Nautilus-Entwickler zu kontaktieren und mit ihnen an einem Patch für den offiziellen Nautilus-Code zu arbeiten, sodass Sie sich nicht mehr darum kümmern müssen, sobald die aktualisierte Version von Nautilus auf Ihrem System verfügbar ist.

Angenommen, Sie haben dies getan, bis diese Änderung auf Ihr System übergreift, müssen Sie sich noch mit dem Problem befassen, dass Sie Ihre eigene gepatchte Version von Nautilus verwenden möchten.

Am einfachsten ist es, ein Paket von Nautilus mit Ihrem bereits angewendeten Patch zu erstellen und es so zu installieren, dass es nicht automatisch aktualisiert wird.

Unter Debian (das Sie gemäß den Tags in dieser Frage verwenden) ist der einfachste Weg, dies zu erreichen:

apt-get install devscripts
apt-get build-dep nautilus # note, this also pulls in build-essential
apt-get source nautilus
cd nautilus-*
# apply your patch
dch -i
# Set the version number of the new changelog entry to something like x.y.z-a.local,
# where "x.y.z-a" is the version of the package as it existed prior to your patch,
# add a description of the change after the '*', then save and exit the editor
debuild -uc -us -i && sudo debi --upgrade
echo "nautilus hold" | sudo dpkg --set-selections

Dadurch wird ein neues Paket mit Ihrem Patch erstellt, installiert und anschließend in dpkg markiert, sodass es nicht mehr automatisch aktualisiert wird.

Wenn das nächste Mal eine aktualisierte Version des Pakets veröffentlicht wird, benachrichtigt apt Sie, dass eine aktualisierte Version vorhanden ist, diese jedoch zurückgehalten wird. Sie müssen dann die oben genannten Schritte erneut ausführen.

Wouter Verhelst
quelle
apt-mark hold packagenameist die moderne Art, ein Paket zu halten. (Ich auch meinen eigenen gemacht dpkg-hold/ dpkg-unholdSkripte in dlocateGebrauch apt-markanstelle der dpkg --set-selectionsMethode , die sie seit Jahren verwendet hatten. Die Skripte wegen apt-mark veraltet sind , aber ich habe noch andere Skripte , die sie nennen, und entferne sie von anderen Benutzern geschriebenen Skripte brechen könnten von das dlocate Paket)
cas
Der Abschnitt in der Warteschleife man apt-marksagt The command is only a wrapper around dpkg --set-selections and the state is therefore maintained by dpkg(1) and not affected by the --file option, also denke ich, dass das eine Kleinigkeit ist ;-)
Wouter Verhelst