Cómo usar mi propia versión de un paquete estándar

10

Encontré un problema con Nautilus para el cual no encontré otra solución que no sea descargar el código fuente, hacer algunos cambios y compilarlo por mi cuenta. Así que ahora tengo dos versiones de nautilus, la versión oficial de los repositorios y la mía con algunos cambios. Me gustaría conservar los dos.

¿Cuál sería una buena manera de decirle a las aplicaciones que usen mi propia versión compilada de Nautilus al iniciar Nautilus desde la aplicación? (por ejemplo, abrir la carpeta de Descargas con firefox)

Descubrí que Firefox llama /usr/bin/nautiluspara poder reemplazar esto con un enlace simbólico a mi propio programa. Sin embargo, creo que este enlace simbólico se sobrescribirá tan pronto como instale una actualización para Nautilus. ¿Hay algo más que pueda hacer?


fuente
1
¿Poner su versión /usr/local/binno funcionó? Es decir, ¿Firefox buscó $PATHy encontró la versión en él /usr/bin, o lo hace (o sus cosas xdg-open) en código duro /usr/bin/nautilus? Instalar su propia versión de algo en / usr / local normalmente funciona.
Peter Cordes el
Lo intenté hace un momento y no funcionó. No sé qué hace internamente Firefox, pero /usr/bin/nautilusparece estar codificado de alguna manera. Si se elimina, firefox ya no hace nada cuando intento abrir la carpeta Descargas, aunque hay un enlace simbólico a mi propia versión de nautilus en /usr/local/bin. Mi $PATHvariable es/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Si tienes curiosidad, podrías correr strace -f -efile,execve -o firefox_syscalls.txt firefoxpara ver qué hace ff. Si busca en el registro nautilus, eso podría mostrarle algo. (Eso -efiltra las llamadas del sistema execvey el archivo abierto / cerrado / nombre de ruta, de lo contrario sería una inundación de futexlectura / escritura de socket para X11).
Peter Cordes

Respuestas:

14

Arreglaría la versión empaquetada de Nautilus, que puede parecer desalentador al principio pero es bastante fácil, aunque no sobrevive a las actualizaciones de paquetes, por lo que requiere cierta disciplina. (Ver la respuesta de Wouter para más detalles).

El enfoque más simple en su situación es agregar un desvío:

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

Esto le dará instrucciones dpkgpara cambiar el nombre /usr/bin/nautilusa /usr/bin/nautilus.originalcada vez que un paquete intenta instalarlo. Luego puede agregar su propio enlace simbólico, y permanecerá intacto incluso cuando se actualice el paquete Nautilus. Para eliminarlo, ejecuta

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

Puede aplicar la misma técnica para cualquier otro archivo que necesite reemplazar de manera similar, aparte de algunos archivos de configuración que no se manejan correctamente cuando se desvían.

Stephen Kitt
fuente
7

La mejor solución a largo plazo es contactar a los desarrolladores de nautilus y trabajar con ellos en un parche para el código oficial de nautilus, de modo que una vez que la versión actualizada de nautilus llegue a su sistema, ya no tendrá que lidiar con esto.

Suponiendo que haya hecho eso, hasta que ese cambio llegue a su sistema, aún tendrá que lidiar con el problema de querer usar su propia versión parcheada de nautilus.

La forma más fácil es producir un paquete de nautilus con su parche ya aplicado e instalarlo de tal manera que no se actualice automáticamente.

En Debian (que según las etiquetas de esta pregunta que está utilizando), la forma más fácil de lograrlo es:

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

Esto crea un nuevo paquete con su parche, lo instala y luego lo marca en dpkg para que ya no se actualice automáticamente.

La próxima vez que se lance una versión actualizada del paquete, apt le notificará que existe una versión actualizada, pero que se está reteniendo. Luego debe hacer lo anterior nuevamente.

Wouter Verhelst
fuente
apt-mark hold packagenamees la forma moderna de sostener un paquete. (Incluso hice mis propios dpkg-hold/ dpkg-unholdscripts en dlocateuso en apt-marklugar del dpkg --set-selectionsmétodo que habían usado durante años. Los scripts son obsoletos debido a apt-mark pero todavía tengo otros scripts que los llaman, y eliminarlos podría romper los scripts escritos por otros usuarios de el paquete dlocate)
cas
La sección en espera man apt-markdice 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, así que creo que es algo menor ;-)
Wouter Verhelst