Como o comando tar funciona para instalar o Node js

10

Ao instalar o Node na minha máquina, usei o comando abaixo que encontrei em um site.

tar --strip-components 1 -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz

Eu sei que tar -xzf é usado para extrair os arquivos, mas eu quero saber como o nó está instalado?

Eu tentei instalá-lo dessa maneira. Eu extraí os arquivos do nó para /usr/local usando o comando abaixo,

tar /usr/local -xzf /usr/save/node-v4.2.1-linux-x64.tar.gz

Mas isso não funciona. Alguém pode me explicar ou me ajudar a entender a diferença entre esses dois comandos?

O que mais o comando 1 está fazendo do que o comando 2 está fazendo?

    
por prathapa reddy 30.03.2017 / 09:15

2 respostas

24

A estrutura de diretórios do tarball é assim:

$ tar tf node-v6.10.1-linux-x64.tar.xz | head
node-v6.10.1-linux-x64/
node-v6.10.1-linux-x64/bin/
node-v6.10.1-linux-x64/bin/npm
node-v6.10.1-linux-x64/bin/node
node-v6.10.1-linux-x64/share/
node-v6.10.1-linux-x64/share/man/
node-v6.10.1-linux-x64/share/man/man1/
node-v6.10.1-linux-x64/share/man/man1/node.1
node-v6.10.1-linux-x64/share/systemtap/
node-v6.10.1-linux-x64/share/systemtap/tapset/

Quando você extrai este arquivo sem outras opções em /usr/local , você recebe isto:

/usr/local/node-v6.10.1-linux-x64/
/usr/local/node-v6.10.1-linux-x64/bin/
/usr/local/node-v6.10.1-linux-x64/bin/npm
/usr/local/node-v6.10.1-linux-x64/bin/node
/usr/local/node-v6.10.1-linux-x64/share/
/usr/local/node-v6.10.1-linux-x64/share/man/
/usr/local/node-v6.10.1-linux-x64/share/man/man1/
/usr/local/node-v6.10.1-linux-x64/share/man/man1/node.1
/usr/local/node-v6.10.1-linux-x64/share/systemtap/
/usr/local/node-v6.10.1-linux-x64/share/systemtap/tapset/

Assim, um novo diretório é criado em /usr/local e os arquivos são despejados lá.

No entanto, com --strip-components=1 , um componente de diretório do caminho extraído é removido, portanto, node-v6.10.1-linux-x64/bin/ se torna bin/ e node-v6.10.1-linux-x64/bin/npm se torna bin/npm :

/usr/local/
/usr/local/bin/
/usr/local/bin/npm
/usr/local/bin/node
/usr/local/share/
/usr/local/share/man/
/usr/local/share/man/man1/
/usr/local/share/man/man1/node.1
/usr/local/share/systemtap/
/usr/local/share/systemtap/tapset/

E /usr/local/bin já está em PATH , então você não precisa fazer mais nada para executar npm e node .

    
por muru 30.03.2017 / 09:30
14

Esta é uma maneira legal (mas irritante) de instalar o NodeJS.

Se você executar tar tf /usr/save/node-v4.2.1-linux-x64.tar.gz no arquivo, verá algo assim:

node-v4.2.1-linux-x64/
node-v4.2.1-linux-x64/bin/
node-v4.2.1-linux-x64/bin/npm
node-v4.2.1-linux-x64/bin/node
node-v4.2.1-linux-x64/share/
node-v4.2.1-linux-x64/share/man/
node-v4.2.1-linux-x64/share/man/man1/

Basicamente, isso significa que quando você extrai este arquivo tar, ele irá extrair para uma pasta chamada node-v4.2.1-linux-x64 com todas essas subpastas (e a instalação do nó) dentro dele. Na verdade, você pode até tentar essa extração para ter uma ideia melhor:

mkdir /tmp/node
cd /tmp/node
tar xvf /usr/save/node-v4.2.1-linux-x64.tar.gz

Se você executar ls , verá uma pasta node-v4.2.1-linux-x64 .

Agora, --strip-components 1 faz algo interessante para o processo de extração. De man tar :

 --strip-components=NUMBER
       strip NUMBER leading components from file names on extraction

Basicamente, isso significa que quando tar vai extrair seu arquivo, ele fingirá que a pasta node-v4.2.1-linux-x64 não está lá. Em vez disso, extrairá bin/ , share/ e todas as outras pastas diretamente.

Na verdade, você pode tentar:

mkdir /tmp/node
cd /tmp/node
tar xvf /usr/save/node-v4.2.1-linux-x64.tar.gz --strip-components=1

Se você executar ls , verá que não há mais uma pasta node-v4.2.1-linux-x64 . É apenas bin/ , include/ , lib/ e share/ (todas coincidentemente pastas em /usr/local/ ).

Seu segundo comando não teria funcionado porque ele teria acabado de extrair a pasta node-v4.2.1-linux-x64 para /usr/local (mesmo que fosse executado). Se você executar ls /usr/local , poderá ver essa pasta por aí. É inútil, sinta-se à vontade para excluir com rm . Quanto a por que é inútil, continue lendo ...

Agora que explicamos como o comando tar funciona, podemos explicar como isso é instalado.

Todo sistema Linux tem algo chamado $PATH variable, que determina onde os arquivos executáveis são armazenados. Entre esses lugares está /usr/local/bin . Quando você extrair esse binário dentro de /usr/local (o que estou certo é o que dizem as instruções de instalação), o binário NodeJS está sendo gravado em /usr/local/bin/node conforme as extrações são feitas. Da mesma forma, todas as bibliotecas estão sendo adicionadas à pasta da biblioteca local e tudo praticamente só vai para onde pertence.

Agora, a ressalva (e por que isso é chato) é que apt não vai ver ou entender ou perceber o que está acontecendo. Você não poderá atualizá-lo usando sudo apt upgrade ou similar. Você precisaria entrar e limpar manualmente a instalação antiga do NodeJS e, em seguida, colocar a nova no caso de você querer atualizar.

Recomendamos que você execute apenas sudo apt install nodejs-legacy . Menos dor e atualiza automaticamente para você.

    
por Kaz Wolfe 30.03.2017 / 09:29