Як використовувати власну версію стандартного пакета


10

Я зіткнувся з проблемою з Nautilus, для якої я не знайшов іншого рішення, крім завантаження вихідного коду, внесення деяких змін та складання його самостійно. Тому зараз у мене є дві версії nautilus, офіційна версія із сховищ і моя з кількома змінами. Я хотів би зберегти і те, і інше.

Що було б хорошим способом підказати програмам використовувати мою власну скомпільовану версію Nautilus при запуску Nautilus з програми? (наприклад, відкриття папки "Завантаження" за допомогою firefox)

Я зрозумів, що Firefox дзвонить, /usr/bin/nautilusщоб я міг просто замінити це символьним посиланням на власну програму. Однак я вважаю, що це посилання буде замінено, як тільки я встановлю оновлення для Nautilus. Чи можна ще щось зробити?

debian  apt 

1
Введення вашої версії /usr/local/binне вийшло? тобто Firefox здійснив пошук у вашій програмі $PATHта знайшов її версію /usr/bin, чи він (або ваш xdg-open речі) жорсткий код /usr/bin/nautilus? Встановлення власної версії чогось у / usr / local зазвичай працює.
Пітер Кордес

Я спробував це тільки зараз, і це не вийшло. Я не знаю, що Firefox робить всередині, але /usr/bin/nautilusздається, що це якось жорстко закодовано. Якщо він видалений, Firefox більше нічого не робить, коли я намагаюся відкрити папку "Завантаження", хоча в моїй версії nautilus є симпосилання /usr/local/bin. Моя $PATHзмінна/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Якщо вам цікаво, ви можете побігти strace -f -efile,execve -o firefox_syscalls.txt firefoxподивитися, що робить FF. Якщо ви шукаєте журнал nautilus, це може вам щось показати. (Це -eфільтрує системні виклики execveта записує речі open / close / pathname, інакше це було б потоком futexта читанням / записом сокета для X11).
Пітер Кордес

Відповіді:


14

Я б виправив упаковану версію Nautilus, яка спочатку може здатися жахливою, але досить простою - хоча вона не переживає оновлення пакету, тому вимагає певної дисципліни. (Докладні відомості див. У відповіді Вутера.)

Найпростіший підхід у вашій ситуації - додати відхилення:

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

Це вказівка dpkgперейменувати /usr/bin/nautilusв /usr/bin/nautilus.originalкожен раз , коли пакет намагається встановити його. Тоді ви можете додати власне символьне посилання, і воно залишиться недоторканим навіть тоді, коли пакет Nautilus буде оновлений. Щоб видалити його, запустіть

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

Ви можете застосувати ту саму техніку до будь-якого іншого файлу, який потрібно замінити аналогічним чином, крім деяких файлів конфігурації, які неправильно обробляються під час переадресації.


7

Найкраще довгострокове рішення - зв’язатися з розробниками nautilus і попрацювати з ними над патчем до офіційного коду nautilus, так що як тільки оновлена ​​версія nautilus потрапить у вашу систему, вам більше не доведеться цим займатися.

Припустимо, що ви це зробили, доки ця зміна не зміниться до вашої системи, вам все одно доведеться розібратися з проблемою бажання використовувати власну виправлену версію nautilus.

Найпростіший спосіб - створити пакет nautilus із уже застосованим патчем та встановити його таким чином, щоб він не оновлювався автоматично.

У Debian (який відповідно до тегів цього питання, який ви використовуєте), це найпростіший спосіб зробити це:

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

Це створює новий пакет із вашим патчем, встановлює його, а потім позначає його в dpkg, щоб він більше не оновлювався автоматично.

Наступного разу, коли оновлена ​​версія пакета буде випущена, apt сповістить вас про те, що оновлена ​​версія існує, але її стримують. Потім вам потрібно зробити все вище заново.


apt-mark hold packagename- це сучасний спосіб тримання пакету. (Я навіть робив власні dpkg-hold/ dpkg-unholdсценарії в dlocateзастосуванні apt-markзамість dpkg --set-selectionsметоду, яким вони користувалися протягом багатьох років. Сценарії застаріли через доцільну позначку, але у мене все ще є інші сценарії, які викликають їх, і видалення їх може зламати скрипти, написані іншими користувачами пакет dlocate)
cas

У розділі про затримку man apt-markйдеться 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, тому я думаю, що це незначна річ ;-)
Wouter Verhelst
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.