Как использовать мою собственную версию стандартного пакета

10

Я столкнулся с проблемой с Nautilus, для которой я не нашел никакого решения, кроме как загрузить исходный код, внести некоторые изменения и скомпилировать его самостоятельно. Так что теперь у меня есть две версии nautilus, официальная версия из репозиториев и моя с некоторыми изменениями. Я хотел бы сохранить оба.

Что может быть хорошим способом сказать приложениям использовать мою собственную скомпилированную версию Nautilus при запуске Nautilus из приложения? (например, открытие папки загрузок с помощью Firefox)

Я понял, что вызовы firefox позволяют /usr/bin/nautilusмне просто заменить это символической ссылкой на мою собственную программу. Однако я полагаю, что эта символическая ссылка будет перезаписана, как только я установлю обновление для Nautilus. Есть ли что-нибудь еще, что я мог сделать?


источник
1
Помещение вашей версии /usr/local/binне сработало? т. е. Firefox проверил ваш файл $PATHи нашел его версию /usr/bin, или он (или ваш материал в xdg-open) содержит жесткий код /usr/bin/nautilus? Установка собственной версии чего-либо в / usr / local обычно работает.
Питер Кордес
Я попробовал это только сейчас, и это не сработало. Я не знаю, что делает Firefox внутри, но, /usr/bin/nautilusпохоже, как-то жестко запрограммирован. Если он удален, Firefox больше ничего не делает, когда я пытаюсь открыть папку «Downloads», хотя есть символическая ссылка на мою собственную версию 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