node.js 多版本管理 nvm的安装和使用

# 安装nvm 
# 项目链接
#https://github.com/nvm-sh/nvm

#1、 安装与更新 使用 curl 或 wget 
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
#
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash


# 2、执行完以上命令后,会在当前用户目录的.bashrc 文件(即  ~/.bashrc)中自动追加类似以下的配置代码
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm


# 3、执行 nvm -v 用于查看nvm的版本号,如果出现 command not found ,说明环境没有完全加载,需要你关闭当前客户端重新登陆一下,或者执行下面代码再次加载一个配置文件
source ~/.bashrc
# 然后再 执行 nvm -v 即可查看到nvm的版本号,说明nvm安装成功
# 使用 nvm 安装 node 并切换版本

# 安装指定版本
nvm install 12 # Now using node v12.22.6 (npm v6.14.5)
node -v # v12.22.6

# 切换指定版本 如果之前没有安装过相关版本 则会提示还示安装相关版本
nvm use 16 # Now using node v16.9.1 (npm v7.21.1)
node -v # v16.9.1

 

 # 在centos 7安装node.js 18以及更高的版本时, 可能会出现 以下错误

# 解决该问题中,参考了以下文章
# https://www.cnblogs.com/riverhan/articles/18298541
# https://www.cnblogs.com/yuwen01/p/18067005
nvm install 18.18.2 # Now using node v18.18.2
# 当想查看node版本时报错
node -v
#node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
#node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)
#node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
#node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
#node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
#node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

# 查看系统内安装的glibc版本 再根据错误信息分析可得知 新版的node v18开始 都需要GLIBC_2.27支持,可是目前系统内却没有那么高的版本strings /lib64/libc.so.6 | grep GLIBC_
# GLIBC_2.2.5
# ...
# GLIBC_2.17

# 解决办法就是更新GLIBC ,根据提示安装所需的高版本 glibc-2.28
# 相关库源链接 http://ftp.gnu.org/gnu/glibc
# 找一个用于保存解压库文件的目录,我用的是 /usr/local/src
cd /usr/local/src
wget http://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
tar xf glibc-2.28.tar.gz 
cd glibc-2.28/ && mkdir build  && cd build
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin

# 在上面配置的时候,可能会出现以下错误,如没有错误请忽略下面的操作
# 错误信息,提示我make编译器太旧,看来得更新一下make编译器
configure: error: 
*** These critical programs are missing or too old: make compiler
*** Check the INSTALL file for required versions.

# 解决方法:升级gcc和make编译器
# 升级GCC(默认为4 升级为8)</span>
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*

# 在执行上面命令的时候可能会提示 
# Loaded plugins: fastestmirror, langpacks
# Repository epel is listed more than once in the configuration
# Loading mirror speeds from cached hostfile
# Could not retrieve mirrorlist http://mirrorlist.centos.org?arch=x86_64&release=7&repo=sclo-sclo error was
# 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Name or service not known"
# ...
# Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64


# 报错解释:这个错误表明系统无法为名为 "centos-sclo-rh" 的软件集合仓库找到有效的基础URL。这通常发生在CentOS系统上,当系统尝试使用已经停止支持的软件仓库时。
# 问题原因:Centos 7版本已经于2024/6/30结束了官方支持。
# 解决方案参考 https://www.cnblogs.com/riverhan/articles/18298541

# 备份当前源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
mv /etc/yum.repos.d/CentOS-SCLo-scl.repo /etc/yum.repos.d/CentOS-SCLo-scl.repo.bak
mv /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo.bak

# 下载新的CentOs-Base.repo到 /etc/yum.repos.d/ 
# CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 或者
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo


# 写入新 配置文件 并保存
vim /etc/yum.repos.d/CentOS-SCLo-rh.repo  
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

# 禁用 yum的 centos-sclo-rh 和 centos-sclo-sclo 选项
yum-config-manager --enable centos-sclo-rh
yum-config-manager --enable centos-sclo-sclo

# 清空yum缓存 并重新生成
yum clean all
yum makecache
# 该部分问题解决后,可以再执行一次 
# yum install -y centos-release-scl
# yum install -y devtoolset-8-gcc*

# 备份旧的gcc和g++ 并将安装最新的gcc和g++替换到原来的位置
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

# 升级 make(默认为3 升级为4)
cd /usr/local/src
wget http://ftp.gnu.org/gnu/make/make-4.3.tar.gz
tar -xzvf make-4.3.tar.gz && cd make-4.3/

./configure  --prefix=/usr/local/make
make && make install
# 备份旧的make编译器,并将新版本替换到原来的位置
cd /usr/bin/ && mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make

# 这时 所有的问题 都已经解决完毕 再重新执行上一步 更新glibc即可
# 先回到 一开始解压并构建的 glibc-2.28/build 目录,然后执行
../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
# 再执行 make && make instsall 该步骤执行时间会有点久,大概20-30分钟左右
make && make install

# 验证一下
node -v
# 仍然有错误
# node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
# node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
# node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)

# 说明要连接一下新的动态库
strings /usr/lib64/libstdc++.so.6 | grep CXXABI
# CXXABI_1.3
# CXXABI_1.3.1
# CXXABI_1.3.2
# CXXABI_1.3.3
# CXXABI_1.3.4
# CXXABI_1.3.5
# CXXABI_1.3.6
# CXXABI_1.3.7
# CXXABI_TM_1

# 更新libstdc++.so.6.0.26
cd /usr/local/src
wget https://cdn.frostbelt.cn/software/libstdc%2B%2B.so.6.0.26
# 将下载的动态库复制到 /usr/lib64目录
cp libstdc++.so.6.0.26 /usr/lib64/
# 将复制的新动态库文件用软链进行替换
ln -snf /usr/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6

# 最后再检测一下
node -v #显示 v18.18.2

# 到此 node 升级成功
# 希望该教程能帮到你

 

posted @ 2024-08-07 14:50  cidgur  阅读(113)  评论(0编辑  收藏  举报