Як працює команда 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замість цього. Менше болю, і він автоматично оновлюється для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.