Jak działa polecenie tar do instalowania Node js

10

Podczas instalowania Node na moim komputerze użyłem poniższego polecenia, które znalazłem na stronie internetowej.

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

Wiem, że tar -xzfsłuży do rozpakowywania archiwów, ale chcę wiedzieć, w jaki sposób instalowany jest węzeł?

Próbowałem zainstalować w ten sposób. Wyodrębniłem pliki węzłów, /usr/localużywając poniższego polecenia,

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

Ale to nie działa. Czy ktoś może wyjaśnić lub pomóc mi zrozumieć różnicę między tymi dwoma poleceniami?

Co więcej robi polecenie 1 niż to, co robi polecenie 2?

prathapa reddy
źródło
1
Można zainstalować jodejspoprzez aptkomendę: sudo apt install nodejs nodejs-legacy.
pa4080

Odpowiedzi:

24

Struktura katalogu tarball wygląda następująco:

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

Po wypakowaniu tego archiwum bez żadnych innych opcji /usr/localotrzymasz:

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

Tak więc tworzony jest nowy katalog /usr/locali pliki są tam zrzucane.

Jednak za pomocą --strip-components=1jeden składnik katalogu z wyodrębnionej ścieżki jest usuwany, więc node-v6.10.1-linux-x64/bin/staje się bin/i node-v6.10.1-linux-x64/bin/npmstaje 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/

I /usr/local/binjest już włączony PATH, więc nie musisz nic robić, aby wykonać npmi node.

muru
źródło
14

Jest to rodzaj fajnego (ale irytującego) sposobu instalowania NodeJS.

Jeśli uruchomisz tar tf /usr/save/node-v4.2.1-linux-x64.tar.gzplik, zobaczysz coś takiego:

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/

Zasadniczo oznacza to, że kiedy rozpakujesz to archiwum tar, wyodrębni ono do folderu o nazwie node-v4.2.1-linux-x64z wszystkimi tymi podfolderami (i instalacją węzła) w nim. W rzeczywistości możesz nawet wypróbować tę ekstrakcję, aby uzyskać lepszy pomysł:

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

Jeśli uruchomisz ls, zobaczysz node-v4.2.1-linux-x64folder.

Teraz --strip-components 1robi coś interesującego w procesie ekstrakcji. Od man tar:

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

Zasadniczo oznacza to, że kiedy tarrozpakujesz swoje archiwum, będzie udawać, że node-v4.2.1-linux-x64folderu go nie ma. Zamiast tego, to będzie ekstraktu bin/, share/a wszystkie inne foldery bezpośrednio.

W rzeczywistości możesz spróbować:

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

Jeśli uruchomisz ls, zobaczysz, że nie ma już node-v4.2.1-linux-x64folderu. To właśnie bin/, include/, lib/oraz share/(wszystkie foldery w przypadkowo /usr/local/).

Twoje drugie polecenie nie zadziałałoby, ponieważ po prostu rozpakowałoby node-v4.2.1-linux-x64folder do /usr/local(jeśli w ogóle działało). Jeśli uruchomisz ls /usr/local, ten folder może się nawet kręcić. Jest bezużyteczny, możesz go usunąć rm. Jeśli chodzi o to, dlaczego jest bezużyteczny, czytaj dalej ...


Teraz, gdy wyjaśniliśmy, jak działa polecenie tar, możemy wyjaśnić, jak to się instaluje.

Każdy system Linux ma coś, co nazywa się $PATHzmienną, która określa, gdzie przechowywane są pliki wykonywalne. Wśród tych miejsc jest /usr/local/bin. Kiedy wyodrębniasz ten plik binarny /usr/local(jestem pewien, że tak mówią instrukcje instalacji), zapisywany jest plik binarny NodeJS /usr/local/bin/nodezgodnie z tym, jak wykonywane są ekstrakcje. Podobnie, wszystkie biblioteki są dodawane do lokalnego folderu biblioteki i wszystko właściwie idzie tylko tam, gdzie należy.

Zastrzeżeniem (i dlaczego jest to denerwujące) jest to, że aptnie zobaczy, nie zrozumie lub nie zda sobie sprawy z tego, co się dzieje. Nie będziesz w stanie zaktualizować go za pośrednictwem sudo apt upgradelub w podobny sposób. Będziesz musiał ręcznie wejść i wyczyścić starą instalację NodeJS, a następnie zainstalować nową, na wypadek gdybyś kiedykolwiek chciał zaktualizować.

Polecam po prostu uruchomić sudo apt install nodejs-legacyzamiast tego. Mniej bólu i automatycznie aktualizuje się dla Ciebie.

Kaz Wolfe
źródło