Jak korzystać z własnej wersji standardowego pakietu

10

Napotkałem problem z Nautilus, dla którego nie znalazłem innego rozwiązania niż pobranie kodu źródłowego, dokonanie pewnych zmian i samodzielne skompilowanie. Mam teraz dwie wersje nautilusa, oficjalną wersję z repozytoriów i moją z kilkoma zmianami. Chciałbym zatrzymać oba.

Jaki byłby dobry sposób, aby powiedzieć aplikacjom, aby korzystały z mojej skompilowanej wersji Nautilusa podczas uruchamiania Nautilusa z poziomu aplikacji? (np. otwieranie folderu Pobrane za pomocą Firefoxa)

Zorientowałem się, że wywołania firefoxa, /usr/bin/nautiluswięc mogłem po prostu zastąpić to dowiązaniem symbolicznym do mojego własnego programu. Uważam jednak, że to dowiązanie symboliczne zostanie zastąpione, gdy tylko zainstaluję aktualizację Nautilus. Czy jest coś jeszcze, co mógłbym zrobić?


źródło
1
Zainstalowanie wersji /usr/local/binnie działało? tzn. czy firefox przeszukał twój plik $PATHi znalazł jego wersję /usr/bin, czy też to (lub twoje xdg-open rzeczy) na stałe /usr/bin/nautilus? Instalacja własnej wersji czegoś w / usr / local zwykle działa.
Peter Cordes
Próbowałem tego właśnie teraz i to nie działało. Nie wiem, co Firefox wewnętrznie robi, ale /usr/bin/nautiluswydaje się, że jest w jakiś sposób zakodowany. Jeśli zostanie usunięty, firefox nie robi już nic, gdy próbuję otworzyć folder Pobrane, chociaż w mojej wersji nautilus znajduje się dowiązanie symboliczne do mojej własnej wersji /usr/local/bin. Moja $PATHzmienna to/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Jeśli jesteś ciekawy, możesz pobiec, strace -f -efile,execve -o firefox_syscalls.txt firefoxaby zobaczyć, co robi ff. Jeśli przeszukujesz dziennik nautilus, może ci to coś pokazać. (To -efiltruje wywołania systemowe execvei pliki open / close / pathname rzeczy, w przeciwnym razie byłoby to zalewanie futexi gniazdo odczytu / zapisu dla X11).
Peter Cordes

Odpowiedzi:

14

Naprawiłbym pakietową wersję Nautilusa, która początkowo może wydawać się zniechęcająca, ale jest dość łatwa - chociaż nie przetrwa aktualizacji pakietu, więc wymaga dyscypliny. (Szczegółowe informacje znajdują się w odpowiedzi Woutera ).

Najprostszym podejściem w twojej sytuacji jest dodanie dywersji:

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

Poinstruuje to, dpkgaby zmienić nazwę /usr/bin/nautilusna /usr/bin/nautilus.originalza każdym razem, gdy pakiet próbuje go zainstalować. Następnie możesz dodać własne dowiązanie symboliczne, które pozostanie nietknięte nawet po uaktualnieniu pakietu Nautilus. Aby go usunąć, uruchom

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

Możesz zastosować tę samą technikę do każdego innego pliku, który chcesz zastąpić w podobny sposób, z wyjątkiem niektórych plików konfiguracyjnych, które nie są poprawnie obsługiwane po przekierowaniu.

Stephen Kitt
źródło
7

Najlepszym długoterminowym rozwiązaniem jest skontaktowanie się z programistami nautilus i praca z nimi nad poprawką do oficjalnego kodu nautilus, dzięki czemu po zaktualizowaniu wersji nautilus trafi do twojego systemu, nie będziesz już musiał sobie z tym radzić.

Zakładając, że to zrobiłeś, dopóki ta zmiana nie spłynie do twojego systemu, nadal będziesz musiał poradzić sobie z problemem chęci korzystania z własnej łatanej wersji nautilusa.

Najprostszym sposobem jest wyprodukowanie pakietu nautilusa z już zainstalowaną łatką i zainstalowanie go w taki sposób, aby nie był aktualizowany automatycznie.

W Debianie (który według tagów tego pytania używasz), najłatwiejszym sposobem na osiągnięcie tego jest:

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

To buduje nowy pakiet z twoją łatą, instaluje ją, a następnie oznacza w dpkg, aby nie była już automatycznie aktualizowana.

Następnym razem, gdy zostanie wydana zaktualizowana wersja pakietu, apt poinformuje cię, że istnieje zaktualizowana wersja, ale jest wstrzymywana. Następnie musisz ponownie wykonać powyższe czynności.

Wouter Verhelst
źródło
apt-mark hold packagenameto nowoczesny sposób przechowywania paczki. (Nawet stworzyłem własne dpkg-hold/ dpkg-unholdskrypty w dlocateużyciu apt-markzamiast dpkg --set-selectionsmetody, której używali od lat. Skrypty są przestarzałe z powodu apt-mark, ale nadal mam inne skrypty, które je wywołują, a ich usunięcie może zepsuć skrypty napisane przez innych użytkowników pakiet dlocate)
cas
Część zawieszona man apt-markmówi 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, więc myślę, że to drobna sprawa ;-)
Wouter Verhelst