Как tar управляет работой для установки Узла js

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

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?

10
задан 30 March 2017 в 00:31

2 ответа

Структура каталогов 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.

24
ответ дан 23 November 2019 в 04:15

Это - вид прохладного (все же раздражающий) способ установить 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, Вы будете видеть a 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, Вы будете видеть, что больше нет a 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 вместо этого. Меньше боли, и это автоматически обновляет для Вас.

14
ответ дан 23 November 2019 в 04:15

Другие вопросы по тегам:

Похожие вопросы: