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/nautilus
wię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ć?
/usr/local/bin
nie działało? tzn. czy firefox przeszukał twój plik$PATH
i 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./usr/bin/nautilus
wydaje 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$PATH
zmienna to/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
strace -f -efile,execve -o firefox_syscalls.txt firefox
aby zobaczyć, co robi ff. Jeśli przeszukujesz dzienniknautilus
, może ci to coś pokazać. (To-e
filtruje wywołania systemoweexecve
i pliki open / close / pathname rzeczy, w przeciwnym razie byłoby to zalewaniefutex
i gniazdo odczytu / zapisu dla X11).Odpowiedzi:
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:
Poinstruuje to,
dpkg
aby zmienić nazwę/usr/bin/nautilus
na/usr/bin/nautilus.original
za 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ąć, uruchomMoż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.
źródło
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:
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.
źródło
apt-mark hold packagename
to nowoczesny sposób przechowywania paczki. (Nawet stworzyłem własnedpkg-hold
/dpkg-unhold
skrypty wdlocate
użyciuapt-mark
zamiastdpkg --set-selections
metody, 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)man apt-mark
mówiThe 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 ;-)