Как работает команда tar для установки Node js

10

При установке Node на мою машину я использовал приведенную ниже команду, которую нашел на веб-сайте.

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

Я знаю, что tar -xzfэто используется для извлечения архивов, но я хочу знать, как устанавливается узел?

Я попытался установить его таким образом. Я извлек файлы узла, /usr/localиспользуя приведенную ниже команду,

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

Но это не работает. Может кто-нибудь объяснить или помочь мне понять разницу между этими двумя командами?

Что больше делает команда 1, чем команда 2?

Пратхапа Редди
источник
1
Вы можете установить с jodejsпомощью aptкоманды: sudo apt install nodejs nodejs-legacy.
pa4080

Ответы:

24

Структура каталогов tarball выглядит следующим образом:

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

Когда вы извлекаете этот архив без каких-либо других параметров /usr/local, вы получаете это:

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

Таким образом, создается новый каталог /usr/local, и файлы там сбрасываются.

Однако при этом --strip-components=1один компонент каталога из извлеченного пути удаляется, поэтому node-v6.10.1-linux-x64/bin/становится bin/и node-v6.10.1-linux-x64/bin/npmстановится 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/

И /usr/local/binуже в PATH, так что вам не нужно ничего делать, чтобы выполнить npmи node.

Мур
источник
14

Это своего рода крутой (но раздражающий) способ установки NodeJS.

Если вы запустите tar tf /usr/save/node-v4.2.1-linux-x64.tar.gzфайл, вы увидите что-то вроде этого:

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/

По сути, это означает, что когда вы извлекаете этот архив tar, он извлекается в папку, которая называется node-v4.2.1-linux-x64всеми этими подпапками (и установкой узла) внутри него. На самом деле, вы можете даже попробовать это извлечение, чтобы получить лучшую идею:

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

Если вы запустите ls, вы увидите node-v4.2.1-linux-x64папку.

Теперь --strip-components 1делает что-то интересное для процесса извлечения. От man tar:

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

По сути, это означает, что когда tarвы собираетесь извлечь ваш архив, он будет притворяться, будто node-v4.2.1-linux-x64папки там нет. Вместо этого он собирается экстракт bin/, share/а все остальные папок непосредственно.

На самом деле, вы можете попробовать это:

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

Если вы запустите ls, вы увидите, что node-v4.2.1-linux-x64папки больше нет . Это просто bin/, include/, lib/и share/(все папки по совпадению в /usr/local/).

Ваша вторая команда не сработала бы, потому что она просто извлекла бы node-v4.2.1-linux-x64папку /usr/local(если бы она вообще работала). Если вы запустите ls /usr/local, вы можете даже увидеть эту папку. Это бесполезно, не стесняйтесь удалять с rm. Что касается того, почему это бесполезно, продолжайте читать ...


Теперь, когда мы объяснили, как работает команда tar, мы можем объяснить, как она устанавливается.

Каждая система Linux имеет нечто, называемое $PATHпеременной, которая определяет, где хранятся исполняемые файлы. Среди этих мест есть /usr/local/bin. Когда вы извлекаете этот двоичный файл изнутри /usr/local(что, я уверен, так сказано в ваших инструкциях по установке), двоичный файл NodeJS записывается /usr/local/bin/nodeв соответствии с тем, как выполняется извлечение. Точно так же все библиотеки добавляются в папку локальной библиотеки, и все в значительной степени просто идет туда, куда нужно.

Теперь, предостережение (и почему это раздражает) состоит в том, что aptвы не увидите, не поймете и не поймете, что происходит. Вы не сможете обновить его через sudo apt upgradeили подобное. Вам нужно будет вручную войти и очистить старую установку NodeJS, а затем вставить новую, если вы когда-нибудь захотите обновить.

Я бы порекомендовал вам просто бежать sudo apt install nodejs-legacy. Меньше боли, и он автоматически обновляется для вас.

Каз Вулф
источник