如何在Linux上安装节点二进制分发文件

时间:2013-11-17 09:05:24

标签: linux node.js

我的生产服务器(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_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'

在这个阶段,经过更多无益的谷歌搜索后,我决定自己深入了解并决定寻求帮助。谁能告诉我我做错了什么?

13 个答案:

答案 0 :(得分:30)

干净的NPM重新安装要快得多,这将删除“损坏的”链接:

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

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

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

答案 1 :(得分:25)

使用节点版本管理器

使用像nvm这样的节点版本管理器来为您处理安装和版本管理。安装nvm后,您只需安装任何节点版本,例如nvm install 8

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

使用apt-get

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

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

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

手动安装二进制文件

为了手动安装二进制文件,您需要做的就是下载二进制文件并创建一堆符号链接。一个接一个地执行下面的命令,它应该完成这项工作。我还编写了一个shell脚本,如果这更容易,可以为你完成(请参阅答案的底部)。希望有所帮助。

确保在第二行为wget使用正确的OS体系结构下载链接(即32位或64位)。

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,则可以使用卸载脚本将其卸载。

安装节点

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

卸载节点

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

答案 2 :(得分: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(例如bowertypescriptcoffee-script),则需要创建软链接到/usr/bin/目录中的每个可执行文件。

或者,您可以将节点安装目录的bin目录(例如/opt/node-v*-linux-x64/)添加到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

此更改将在注销后重新生效。

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

答案 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

答案 4 :(得分:5)

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

您可以立即运行node和npm。

以前在旧版本的存档中的README中记录了它。

答案 5 :(得分: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

答案 6 :(得分:1)

我倾向于使用nave来安装二进制文件。使用wget下载nave.sh文件,然后使用它来安装节点。如果你的一个生产应用程序需要不同于全局安装的节点版本,Nave也很高兴。

$ wget https://raw.github.com/isaacs/nave/master/nave.sh
$ sudo bash nave.sh usemain 0.10.22

答案 7 :(得分: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。

答案 8 :(得分:1)

在Mac OS X中cp的手册页中:

  

除非设置-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。这就是你收到错误的原因。

答案 9 :(得分:1)

我遇到了同样的问题。

问题是/ usr / local / bin中的npm excutable。

我解决它的方式是:

sudo rm /usr/local/bin/npm

sudo ln -s "/usr/local/lib/node_modules/npm/bin/npm-cli.js" /usr/local/bin/npm

答案 10 :(得分:0)

在Ubuntu中有一个.bashrc文件,用于设置二进制文件的路径。

默认情况下,主目录中有bin的路径集。也许您可以在主目录中创建 bin 目录并在那里移动二进制文件。重新启动系统并尝试执行命令node

答案 11 :(得分:0)

我遇到了同样的问题。所以,我符号链接 节点 npm /usr/local/bincounter++

答案 12 :(得分:0)

如果有人对使用Docker感兴趣,请在Dockerfile中

ENV NODE_VERSION 8.10.0
RUN wget https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz
RUN tar -xJvf node-v$NODE_VERSION-linux-x64.tar.xz -C /usr/local/
ENV NODEJS_HOME /usr/local/node-v$NODE_VERSION-linux-x64
ENV PATH $NODEJS_HOME/bin:$PATH

RUN node --version
RUN npm --version