Comment utiliser ma propre version d'un package standard

10

J'ai rencontré un problème avec Nautilus pour lequel je n'ai trouvé aucune solution autre que de télécharger le code source, d'apporter quelques modifications et de le compiler par moi-même. Alors maintenant, j'ai deux versions de nautilus, la version officielle des dépôts et la mienne avec quelques changements. Je voudrais garder les deux.

Quelle serait une bonne façon de dire aux applications d'utiliser ma propre version compilée de Nautilus lors du démarrage de Nautilus depuis l'application? (par exemple, ouverture du dossier Téléchargements avec Firefox)

J'ai compris que firefox appelle /usr/bin/nautiluspour que je puisse simplement le remplacer par un lien symbolique vers mon propre programme. Cependant, je pense que ce lien symbolique sera écrasé dès que j'installerai une mise à jour pour Nautilus. Puis-je faire autre chose?


la source
1
Mettre votre version /usr/local/binn'a pas fonctionné? c.-à-d. Firefox a-t-il recherché $PATHet trouvé la version dans /usr/bin, ou est-ce (ou votre truc xdg-open) un code dur /usr/bin/nautilus? L'installation de votre propre version de quelque chose dans / usr / local fonctionne normalement.
Peter Cordes
J'ai essayé cela tout à l'heure et cela n'a pas fonctionné. Je ne sais pas ce que Firefox fait en interne, mais /usr/bin/nautilussemble être codé en dur d'une manière ou d'une autre. S'il est supprimé, Firefox ne fait plus rien lorsque j'essaie d'ouvrir le dossier Téléchargements, bien qu'il existe un lien symbolique vers ma propre version de Nautilus dans /usr/local/bin. Ma $PATHvariable est/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Si vous êtes curieux, vous pouvez courir strace -f -efile,execve -o firefox_syscalls.txt firefoxpour voir ce que ff fait. Si vous recherchez le journal nautilus, cela pourrait vous montrer quelque chose. (Cela -efiltre les appels système execveet les fichiers open / close / pathname, sinon ce serait un flot de futexlecture / écriture de socket pour X11).
Peter Cordes

Réponses:

14

Je corrigerais la version packagée de Nautilus, qui peut sembler intimidante au premier abord, mais qui est assez facile - bien qu'elle ne survive pas aux mises à niveau du package, elle nécessite donc une certaine discipline. (Voir la réponse de Wouter pour plus de détails.)

L'approche la plus simple dans votre situation est d'ajouter un détournement:

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

Cela demandera dpkgde renommer /usr/bin/nautilusà /usr/bin/nautilus.originalchaque fois qu'un paquet essaie de l' installer. Ensuite, vous pouvez ajouter votre propre lien symbolique, et il restera intact même lorsque le package Nautilus est mis à niveau. Pour le supprimer, exécutez

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

Vous pouvez appliquer la même technique pour tout autre fichier que vous devez remplacer de la même manière, à l'exception de certains fichiers de configuration qui ne sont pas traités correctement lorsqu'ils sont détournés.

Stephen Kitt
la source
7

La meilleure solution à long terme est de contacter les développeurs de nautilus et de travailler avec eux sur un correctif au code nautilus officiel, de sorte qu'une fois que la version mise à jour de nautilus arrivera sur votre système, vous n'aurez plus à vous en occuper.

En supposant que vous l'ayez fait, jusqu'à ce que ce changement se répercute sur votre système, vous devrez toujours résoudre le problème de vouloir utiliser votre propre version corrigée de nautilus.

Le moyen le plus simple est de produire un paquet de nautilus avec votre patch déjà appliqué, et de l'installer de manière à ce qu'il ne soit pas mis à jour automatiquement.

Sur Debian (qui, selon les balises que vous utilisez sur cette question), la façon la plus simple d'y parvenir est:

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

Cela crée un nouveau package avec votre correctif, l'installe, puis le marque dans dpkg afin qu'il ne soit plus mis à jour automatiquement.

La prochaine fois qu'une version mise à jour du package sera publiée, apt vous informera qu'une version mise à jour existe, mais qu'elle est bloquée. Vous devez ensuite refaire ce qui précède.

Wouter Verhelst
la source
apt-mark hold packagenameest la façon moderne de tenir un colis. (J'ai même fait mes propres dpkg-hold/ dpkg-unholdscripts dlocateutilisé au apt-marklieu de la dpkg --set-selectionsméthode qu'ils avaient utilisé pendant des années. Les scripts sont obsolètes en raison de apt-marque mais j'ai encore d' autres scripts qui les appellent, et les enlever peut casser des scripts écrits par d' autres utilisateurs de le package dlocate)
cas
La section en attente man apt-markdit 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, donc je pense que c'est une chose mineure ;-)
Wouter Verhelst