Como usar minha própria versão de um pacote padrão

10

Encontrei um problema com o Nautilus, para o qual não encontrei outra solução além de baixar o código-fonte, fazer algumas alterações e compilá-lo por conta própria. Então agora eu tenho duas versões do nautilus, a versão oficial dos repositórios e a minha com algumas alterações. Eu gostaria de manter os dois.

Qual seria uma boa maneira de dizer aos aplicativos para usar minha própria versão compilada do Nautilus ao iniciar o Nautilus de dentro do aplicativo? (por exemplo, abrir a pasta Downloads com o Firefox)

Eu descobri que o firefox chama /usr/bin/nautiluspara que eu pudesse substituir isso por um link simbólico para o meu próprio programa. No entanto, acredito que esse link simbólico será substituído assim que eu instalar uma atualização para o Nautilus. Há mais alguma coisa que eu poderia fazer?


fonte
1
Colocar sua versão /usr/local/binnão funcionou? ou seja, o firefox pesquisou o seu $PATHe encontrou a versão no /usr/bincódigo-fonte (ou o seu material xdg-open) /usr/bin/nautilus? Instalar sua própria versão de algo em / usr / local normalmente funciona.
Peter Cordes
Eu tentei isso agora e não funcionou. Eu não sei o que o firefox faz internamente, mas /usr/bin/nautilusparece ser codificado de alguma forma. Se ele for removido, o Firefox não fará mais nada quando eu tentar abrir a pasta Downloads, embora exista um link simbólico para minha própria versão do nautilus in /usr/local/bin. Minha $PATHvariável é/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Se você estiver curioso, poderá correr strace -f -efile,execve -o firefox_syscalls.txt firefoxpara ver o que o ff faz. Se você pesquisar o log nautilus, isso poderá mostrar uma coisa. (Isso -efiltra o sistema solicita execvee arquiva coisas de abrir / fechar / nome do caminho, caso contrário, seria uma inundação futexe leitura / gravação de soquete para o X11).
Peter Cordes

Respostas:

14

Eu consertaria a versão empacotada do Nautilus, que pode parecer assustadora no começo, mas é bastante fácil - embora não sobreviva às atualizações de pacotes, portanto, requer alguma disciplina. (Veja a resposta de Wouter para obter detalhes.)

A abordagem mais simples na sua situação é adicionar um desvio:

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

Isso instruirá dpkga renomear /usr/bin/nautiluspara /usr/bin/nautilus.originalsempre que um pacote tentar instalá-lo. Em seguida, você pode adicionar seu próprio link simbólico, e ele permanecerá intocado, mesmo quando o pacote Nautilus for atualizado. Para removê-lo, execute

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

Você pode aplicar a mesma técnica a qualquer outro arquivo que precise substituir de maneira semelhante, além de alguns arquivos de configuração que não são tratados corretamente quando desviados.

Stephen Kitt
fonte
7

A melhor solução a longo prazo é entrar em contato com os desenvolvedores do nautilus e trabalhar com eles em um patch do código oficial do nautilus, para que uma vez que a versão atualizada do nautilus atinja seu sistema, você não precisará mais lidar com isso.

Supondo que você tenha feito isso, até que essa mudança chegue ao seu sistema, você ainda precisará lidar com a questão de querer usar sua própria versão corrigida do nautilus.

A maneira mais fácil é produzir um pacote de nautilus com seu patch já aplicado e instalá-lo de forma que não seja atualizado automaticamente.

No Debian (que de acordo com as tags nesta pergunta você está usando), a maneira mais fácil de conseguir isso é:

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

Isso cria um novo pacote com o seu patch, instala e marca-o no dpkg para que ele não seja mais atualizado automaticamente.

Na próxima vez que uma versão atualizada do pacote for lançada, o apt notificará que existe uma versão atualizada, mas que está sendo retida. Você precisa fazer o acima novamente.

Wouter Verhelst
fonte
apt-mark hold packagenameé a maneira moderna de segurar um pacote. (Eu até fiz minhas próprias dpkg-hold/ dpkg-unholdroteiros em dlocateuso apt-markem vez do dpkg --set-selectionsmétodo que tinha usado durante anos. Os scripts são obsoletos por causa do apt-marca, mas ainda tenho outros scripts que os chamam, e removê-los pode interromper scripts escritos por outros usuários o pacote dlocate)
cas
A seção em espera no man apt-markdiz 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, então eu acho que é uma coisa menor ;-)
Wouter Verhelst