在我的计算机上安装 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
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
。
答案2
这是一种很酷(但很烦人)的安装 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
。这样麻烦更少,而且它会自动更新。