Sistema alternativo do Debian: programas com o mesmo nome e prioridades

3

Não consigo entender da documentação de update-alternatives como o sistema de prioridades funciona.

Suponha que eu queira que /usr/bin/node aponte para nodejs para aplicativos nodejs e para um programa de rádio amador, chamado node , em outros casos. Eu tenho que dizer:

update-alternatives --install /usr/bin/node nodejs /usr/bin/nodejs 100 --slave /usr/share/man/...

Suponha que eu tenha 2 programas que esperam que /usr/bin/node sejam coisas diferentes, primeiro - nodejs, segundo - radioamador. Como eles determinariam qual deles usar?

Qual é o papel de prioridade neste processo?

ADIÇÃO: Observe que npm , gerenciador de pacotes nodejs, espera que o comando nodejs seja chamado node , portanto, preciso instalar o nodejs como node .

    
por Boris Burkov 13.09.2015 / 14:33

2 respostas

1

A qualquer momento, /usr/bin/node só pode ser um dos programas. O mecanismo de alternativas é uma maneira de escolher qual delas é.

Prioridades controlam qual é o padrão quando ambos estão instalados. Eles não oferecem uma maneira de ter os dois e escolher entre os dois com base em qual outro programa chamado este.

Quando os programas chamam uns aos outros por nome, só pode haver um único programa por um nome que vem primeiro no caminho de busca. Você deve desambiguar o comando node em seus programas. Seguindo o Debian , use nodejs para Node.js e ax25-node para o programa HAM. Se houver uma que seria realmente irritante de alterar, instale o pacote node (que torna /usr/bin/node um alias para ax25-node ) ou o pacote nodejs-legacy (que torna /usr/bin/node um alias para nodejs ).

Se você realmente tem muitos programas que chamam node e que não podem ser alterados facilmente, execute-os com diferentes variáveis PATH , uma contendo um diretório contendo um link simbólico para ax25-node e um contendo um diretório contendo um link simbólico para nodejs :

mkdir -p /usr/local/etc/nodejs/bin /usr/local/etc/ax25/bin
ln -s ../../../../bin/nodejs /usr/local/etc/nodejs/bin/node
ln -s ../../../../bin/ax25-node /usr/local/etc/ax25/bin/node

PATH=/usr/local/etc/ax25/bin:$PATH program-using-ax25
PATH=/usr/local/etc/node/bin:$PATH program-using-nodejs
    
por 14.09.2015 / 01:29
8

Eu acho que você está entendendo mal o papel do sistema de alternativas aqui. Ele é usado para fornecer uma maneira simples de usar programas alternativos de um tipo semelhante. O exemplo usual e o usado na man page é um editor:

For example, if the text editors ed(1) and nvi(1) are both installed on the system, the alternatives system will cause the generic name /usr/bin/editor to refer to /usr/bin/nvi by default.

No seu caso, node refere-se a dois aplicativos completamente diferentes.

Se ambos forem instaláveis a partir do repositório principal da Debian, então é provável que um dos mantenedores do pacote tenha nomeado seu executável para que ele não entre em conflito com o outro. Por exemplo, o binário para o aplicativo de rádio pode ter sido renomeado para /usr/bin/node_radio , de modo que não entre em conflito com o Node.js /usr/bin/node .

Por outro lado, se você estiver compilando o radioamador node , você deve garantir que você altere a compilação para que ela não crie o mesmo nome binário ou assegure que ela seja instalada em um arquivo diferente. caminho, como /usr/local/bin/node . Se você optar por este último, então qual node é executado quando você digita no prompt de comando depende da ordem de pesquisa na variável $PATH . Se o errado for executado, você terá que digitar o caminho completo para executá-lo: /usr/local/bin/node .

Em qualquer caso, update-alternatives não ajuda você aqui.

Tudo acima é apenas um exemplo, uma verificação rápida com apt-get download node seguido por dpkg --contents node_0.3.2-7.4_all.deb mostra que o rádio amador node está instalado como /usr/sbin/ax25-node com um link de /usr/sbin/node para o executável. O Node.js instala /usr/bin/nodejs , portanto, os dois nunca entrarão em conflito.

    
por 13.09.2015 / 15:15