如何在Linux上安装Node二进制发行版文件

32

我的生产服务器(Centos 5.9)无法编译nodejs,可能是因为它的gcc只有4.1.2(建议使用4.2或更高版本),所以我尝试安装二进制文件。

$ wget http://nodejs.org/dist/v0.10.22/node-v0.10.22-linux-x86.tar.gz
$ tar -zxvf node-v0.10.22-linux-x86.tar.gz
$ cd node-v0.10.22-linux-x86
$ sudo cp bin/* /usr/local/bin
$ sudo cp -R lib/* /usr/local/lib
$ sudo cp -R share/* /usr/local/share

现在是测试时间:

$ node -v  # => v0.10.22
$ man node # looks fine
$ npm -v   # UH OH, PROBLEM - Cannot find module 'npmlog'

现在(请记住我是一个完全的Node初学者),我进行了一些搜索,并发现有一个名为NODE_PATH的环境变量,因此我尝试:

$ export NODE_PATH=/usr/local/lib/node_modules
$ npm -v   # SAME PROBLEM - Cannot find module 'npmlog'

于是我找到了npmlog的位置,并尝试相应地修改NODE_PATH:

$ find /usr/local/lib -name npmlog # => /usr/local/lib/node_modules/npm/node_modules/npmlog
$ export NODE_PATH=/usr/local/lib/node_modules/npm/node_modules
$ npm -v   # DIFFERENT PROBLEM - Can't find '../lib/npm.js'

在进行了更多无用的谷歌搜索后,我意识到自己已经深陷其中,决定寻求帮助。有谁能告诉我哪里出了错吗?


将 Linux 文件与我在 OSX 开发机上成功安装了 Node 的 brew 进行比较,我注意到 /usr/local/lib/node_modules/npm 中缺少一个文件,即 npmrc,其中只包含“prefix = /usr/local”。然而,在 Linux 上添加此文件没有任何效果。 - sanichi
13个回答

30

进行干净的 NPM 重新安装会更快,它将删除“损坏”的链接:

wget https://npmjs.org/install.sh

chmod +x install.sh
sudo ./install.sh

然后它会要求您删除旧的NPM链接。


1
这是我发现的最简单的解决方案,可以安装npmnoden软件包使得管理Node.js变得轻而易举。 - dimiguel
这应该是首选答案。 - Christian

25

使用Node版本管理器

使用像nvm这样的Node版本管理器来为您处理安装和版本管理。安装了nvm之后,您可以简单地安装任何Node版本,例如nvm install 8

但如果您只想自己安装二进制文件,请参见下文:

使用apt-get

在特殊情况下,您需要系统范围内的Node安装,您可以使用apt-get:

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

以上代码片段将安装最新版本的Node 8。

手动安装二进制文件

要手动安装二进制文件,您只需要下载二进制文件并创建一些符号链接即可。按照下面的命令一个接一个地执行,它应该能完成工作。如果这样太麻烦,我还编写了一个Shell脚本来自动化此过程(请参见答案底部)。希望对您有所帮助。

确保在第二行使用正确的操作系统架构(即32位或64位)的wget下载链接。

ME=$(whoami) ; sudo chown -R $ME /usr/local && cd /usr/local/bin #adding yourself to the group to access /usr/local/bin
mkdir _node && cd $_ && wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz -O - | tar zxf - --strip-components=1
ln -s "/usr/local/bin/_node/bin/node" .. # Making the symbolic link to node
ln -s "/usr/local/bin/_node/lib/node_modules/npm/bin/npm-cli.js" ../npm ## making the symbolic link to npm

这是一个Shell脚本,它可以下载并安装所有组件。如果您使用此脚本安装Node,则可以使用卸载脚本将其卸载。

安装Node

#! /bin/bash
# run it by: bash install-node.sh
read -p " which version of Node do you need to install: for example 8.11.4 (or any other valid version): " VERSIONNAME
read -p " Are you using a 32-bit or 64-bit operating system ? Enter 64 or 32: " ARCHVALUE
if [[ $ARCHVALUE = 32 ]]
    then
    printf "user put in 32 \n"
    ARCHVALUE=86
    URL=https://nodejs.org/dist/v${VERSIONNAME}/node-v${VERSIONNAME}-linux-x${ARCHVALUE}.tar.gz

elif [[ $ARCHVALUE = 64 ]]
    then
    printf "user put in 64 \n"
    ARCHVALUE=64
    URL=https://nodejs.org/dist/v${VERSIONNAME}/node-v${VERSIONNAME}-linux-x${ARCHVALUE}.tar.gz

else
    printf "invalid input expted either 32 or 64 as input, quitting ... \n"

    exit
fi

# setting up the folders and the the symbolic links
printf $URL"\n"
ME=$(whoami) ; sudo chown -R $ME /usr/local && cd /usr/local/bin #adding yourself to the group to access /usr/local/bin
mkdir _node && cd $_ && wget $URL -O - | tar zxf - --strip-components=1 # downloads and unzips the content to _node
cp -r ./lib/node_modules/ /usr/local/lib/ # copy the node modules folder to the /lib/ folder
cp -r ./include/node /usr/local/include/ # copy the /include/node folder to /usr/local/include folder
mkdir /usr/local/man/man1 # create the man folder
cp ./share/man/man1/node.1 /usr/local/man/man1/ # copy the man file
cp bin/node /usr/local/bin/ # copy node to the bin folder
ln -s "/usr/local/lib/node_modules/npm/bin/npm-cli.js" ../npm ## making the symbolic link to npm

# print the version of node and npm
node -v
npm -v

卸载Node

#! /bin/bash
# run it by: ./uninstall-node.sh
sudo rm -rf /usr/local/bin/npm
sudo rm -rf /usr/local/bin/node
sudo rm -rf /usr/local/lib/node_modules/
sudo rm -rf /usr/local/include/node/
sudo rm -rf /usr/local/share/man/man1/node.1
sudo rm -rf /usr/local/bin/_node/ 

12
我遇到过一个类似的问题,但是是在 iojs 上。不过应该是同样的步骤:
(假设你的当前目录中有一个与node-v*-linux-x64.tar.gz相匹配的文件):
# In case of iojs you need to replace the occurrences of 'node' with 'iojs'
# Extract the downloaded archive with the linux-x64 version of node
tar zxf node-v*-linux-x64.tar.gz
# Move the extracted folder (./node-v*-linux-x64/) to /opt/
mv ./node-v*-linux-x64/ /opt/
为了使二进制文件在您的shell中可用,请在/usr/bin/目录内创建一些软链接:
# Create a softlink to node in /usr/bin/
ln -s /opt/node-v*-linux-x64/bin/node /usr/bin/node
# Create a softlink to npm  in /usr/bin/
ln -s /opt/node-v*-linux-x64/bin/npm  /usr/bin/npm
# Create a softlink to iojs in /usr/bin (this step can be omitted if you're using node)
ln -s /opt/node-v*-linux-x64/bin/iojs /usr/bin/iojs

注意:如果您想要访问一些全局安装的节点模块的CLI(例如,typescriptcoffee-script),则需要在/usr/bin/目录中为每个可执行文件创建软链接。

或者,您可以将节点安装目录(例如/opt/node-v*-linux-x64/)的bin目录添加到PATH环境变量中:(应使用绝对路径!)

# create a new .sh script in /etc/profile.d which adds the directory to PATH
echo "export PATH=$PATH:/opt/node-v0.12.3-linux-x64/bin" > /etc/profile.d/node-npm.sh

登出并重新登录后,此更改将生效。

这两种方法对我都有效(我使用的是Ubuntu 14.04/15.04桌面版和GNOME 3)。


6

我也遇到了这个问题。通过删除 /usr/local/bin/npm 并创建一个链接指向 /usr/local/lib/node_modules/npm/bin/npm-cli.js,解决了这个问题。

$ ls -l /usr/local/bin/
node
npm -> /usr/local/lib/node_modules/npm/bin/npm-cli.js


$ npm -v
1.3.17

6
wget <node archive url from nodejs.org>
cd /usr/local
sudo tar --strip-components 1 -xf <path to node archive>

您可以立即运行Node和NPM。

在旧版本中,它曾在归档文件的README中记录。


这很简单,而且它有效。如果您希望二进制文件对于“root”用户在路径上,请考虑安装在/usr而不是/usr/local - Nate

4

我曾经遇到同样的问题,但通过创建符号链接而不是复制二进制文件来解决了它。

$ cd /usr/local/src
$ wget http://nodejs.org/dist/v0.10.24/node-v0.10.24-linux-x64.tar.gz
$ tar -zxvf node-v0.10.24-linux-x64.tar.gz
$ cd node-v0.10.24-linux-x64
$ sudo cp -R lib/* /usr/local/lib
$ sudo cp -R share/* /usr/local/share
$ ln -s /usr/local/src/node-v0.10.24-linux-x64/bin/node /usr/local/bin/node
$ ln -s /usr/local/src/node-v0.10.24-linux-x64/bin/npm /usr/local/bin/npm
$ node -v
v0.10.24
$ npm -v
1.3.21

谢谢!小提醒:您漏掉了 include(除了 libshare)。 - agam

1
你可以使用GNU stow命令将这些二进制文件的符号链接正确地创建在/usr/local目录中。Stow还允许您轻松地在以后从/usr/local中删除Node js并交换多个版本的Node js。
$ # first, install stow
$ mkdir /usr/local/stow # if it doesn't exist
$ # then, place software binary package in /usr/local/stow
$ cd /usr/local/stow
$ stow <package_name>  # install / add sym links
$ source $HOME/.bash_profile  # reload your environment
$ # node -v and npm -v should now work
$ stow -D <package_name> # uninstall / remove sym links

这些步骤适用于我使用的node-v0.10.17-linux-x64版本。


1
我倾向于使用nave来安装二进制文件。使用wget下载nave.sh文件,然后使用它来安装node。在生产应用程序需要不同版本的node时,nave也很有用。请注意保留html标签。
$ wget https://raw.github.com/isaacs/nave/master/nave.sh
$ sudo bash nave.sh usemain 0.10.22

1
我遇到了同样的问题。
问题出在 /usr/local/bin 中的 npm 可执行文件上。
我解决的方法是:
sudo rm /usr/local/bin/npm
sudo ln -s "/usr/local/lib/node_modules/npm/bin/npm-cli.js" /usr/local/bin/npm

1
在 Mac OS X 中的 cp 的 man 手册中,总是默认跟随符号链接除非设置了 -R 标志,此时默认不跟随符号链接。
当你执行 sudo cp bin/* /usr/local/bin 时,符号链接 bin/npm 被跟随了。
实际上,bin/npm 链接到 ../lib/node_modules/npm/bin/npm-cli.js,因此 cp 将会把 npm-cli.js 复制到 /usr/local/bin。这就是为什么会出现错误的原因。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接