Como o comando tar funciona para instalar o nó 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

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

Eu tentei instalá-lo dessa maneira. Eu extraí os arquivos do nó para /usr/localusar 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 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?

prathapa reddy
fonte
1
Você pode instalar jodejsatravés de aptcomando: sudo apt install nodejs nodejs-legacy.
pa4080

Respostas:

24

A estrutura do diretório 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 esse arquivo sem outras opções /usr/local, obtém o seguinte:

/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/

Portanto, um novo diretório é criado /usr/locale os arquivos são despejados lá.

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

/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/binjá está dentro PATH, então você não precisa fazer mais nada para executar npme node.

muru
fonte
14

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

Se você executar tar tf /usr/save/node-v4.2.1-linux-x64.tar.gzo arquivo, verá algo parecido com isto:

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 esse arquivo tar, ele será extraído para uma pasta chamada node-v4.2.1-linux-x64com todas essas subpastas (e a instalação do nó) dentro dele. Na verdade, você pode até tentar essa extração para ter uma idéia 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 node-v4.2.1-linux-x64pasta.

Agora, --strip-components 1faz 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 tarvocê extrair seu arquivo, fingirá que a node-v4.2.1-linux-x64pasta não está lá. Em vez disso, ele vai extrato bin/, share/e todas as outras pastas diretamente.

De fato, 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 node-v4.2.1-linux-x64pasta. É apenas bin/, include/, lib/, e share/(todos coincidentemente pastas no /usr/local/).

Seu segundo comando não teria funcionado porque teria extraído a node-v4.2.1-linux-x64pasta para /usr/local(se é que foi executada). Se você executar ls /usr/local, poderá até ver esta pasta por aí. É inútil, sinta-se à vontade para excluir com rm. 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 $PATHvariável, que determina onde os arquivos executáveis ​​são armazenados. Entre esses lugares é /usr/local/bin. Quando você extrai esse binário interno /usr/local(o que diz as instruções de instalação), o binário do NodeJS está sendo gravado de /usr/local/bin/nodeacordo com o modo como as extrações são feitas. Da mesma forma, todas as bibliotecas estão sendo adicionadas à pasta da biblioteca local e praticamente tudo vai aonde pertence.

Agora, a ressalva (e por que isso é irritante) é que aptnão vai ver, entender ou perceber o que está acontecendo. Você não poderá atualizá-lo por meio sudo apt upgradeou similar. Você precisaria entrar manualmente e limpar a instalação antiga do NodeJS e, em seguida, instalar a nova, caso deseje atualizar.

Eu recomendaria que você apenas corresse sudo apt install nodejs-legacy. Menos dor e é atualizado automaticamente para você.

Kaz Wolfe
fonte