134 lines
4.5 KiB
Bash
134 lines
4.5 KiB
Bash
#!/bin/bash
|
|
# ==============================================================
|
|
# NVM 部署脚本 - 一键安装 nvm + Node.js LTS 稳定版 + 换源加速
|
|
# ==============================================================
|
|
# 适用系统: Ubuntu 20.04+
|
|
# 说明: 使用国内镜像源加速,避免 GitHub raw 下载缓慢
|
|
# 安装 Node.js LTS 版(比 latest 更小更快)
|
|
#
|
|
# 注意:脚本可能通过 sudo 以 root 身份执行,
|
|
# 因此需要检测原始用户并切换到该用户安装 nvm,
|
|
# 避免 nvm 装到 /root 下导致原用户看不到。
|
|
# =============================================================
|
|
|
|
set -e
|
|
|
|
echo "========================================"
|
|
echo " NVM 部署脚本 - 开始安装..."
|
|
echo "========================================"
|
|
|
|
# ---------- 检测原始用户 ----------
|
|
# 如果通过 sudo 运行,SUDO_USER 会保留原用户名
|
|
if [ -n "$SUDO_USER" ]; then
|
|
REAL_USER="$SUDO_USER"
|
|
REAL_HOME=$(getent passwd "$REAL_USER" | cut -d: -f6)
|
|
if [ -z "$REAL_HOME" ]; then
|
|
REAL_HOME="/home/$REAL_USER"
|
|
fi
|
|
else
|
|
REAL_USER=$(whoami)
|
|
REAL_HOME="$HOME"
|
|
fi
|
|
|
|
echo " 检测到实际用户: $REAL_USER"
|
|
echo " 用户目录: $REAL_HOME"
|
|
echo ""
|
|
|
|
NVM_VERSION="v0.39.7"
|
|
NODE_LTS_VERSION="--lts" # 安装 LTS 最新版(比 install node 的 latest 版更小)
|
|
|
|
# ---------- 辅助函数:以原始用户身份执行命令 ----------
|
|
run_as_user() {
|
|
if [ "$(whoami)" != "$REAL_USER" ]; then
|
|
sudo -u "$REAL_USER" bash -c "$*"
|
|
else
|
|
bash -c "$*"
|
|
fi
|
|
}
|
|
|
|
# 1. 安装 nvm(使用 gitee 镜像加速)
|
|
echo "[1/4] 正在安装 nvm ${NVM_VERSION}..."
|
|
# 优先用 gitee 镜像(国内快),失败则回滚到 GitHub 官方
|
|
NVM_INSTALL_URL="https://gitee.com/mirrors/nvm/raw/${NVM_VERSION}/install.sh"
|
|
echo " 下载源: ${NVM_INSTALL_URL}"
|
|
|
|
# 以原始用户身份下载并执行安装脚本
|
|
rm -f /tmp/install_nvm.sh
|
|
if timeout 30 curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh 2>/dev/null; then
|
|
echo " ✅ 从 Gitee 镜像下载成功"
|
|
else
|
|
echo " ⚠ Gitee 镜像下载失败,切换到 GitHub 源..."
|
|
NVM_INSTALL_URL="https://raw.githubusercontent.com/nvm-sh/nvm/${NVM_VERSION}/install.sh"
|
|
curl -fsSL "${NVM_INSTALL_URL}" -o /tmp/install_nvm.sh
|
|
fi
|
|
|
|
# 以原始用户身份执行安装(不要用 sudo)
|
|
chown "$REAL_USER":"$REAL_USER" /tmp/install_nvm.sh 2>/dev/null || true
|
|
sudo -u "$REAL_USER" bash /tmp/install_nvm.sh
|
|
rm -f /tmp/install_nvm.sh
|
|
|
|
# 2. 加载 nvm 到当前 shell(以原始用户身份)
|
|
echo "[2/4] 正在加载 nvm 环境变量..."
|
|
export NVM_DIR="$REAL_HOME/.nvm"
|
|
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
\. "$NVM_DIR/nvm.sh"
|
|
echo " nvm 已加载"
|
|
else
|
|
echo " ⚠ nvm.sh 未找到,可能安装过程中出现问题"
|
|
ls -la "$NVM_DIR" 2>/dev/null || echo " .nvm 目录不存在"
|
|
fi
|
|
|
|
# 3. 配置淘宝镜像源(加速 Node.js 下载)
|
|
echo "[3/4] 正在配置淘宝镜像源..."
|
|
echo 'export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node' >> "$REAL_HOME/.bashrc"
|
|
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
|
|
echo " 镜像源已配置: NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node"
|
|
|
|
# 4. 安装 Node.js LTS 版
|
|
echo "[4/4] 正在安装 Node.js LTS 版本(稳定版)..."
|
|
echo " 下载源: ${NVM_NODEJS_ORG_MIRROR}"
|
|
# nvm install 必须以原始用户身份执行,否则 $NVM_DIR 不匹配
|
|
sudo -u "$REAL_USER" bash -c "
|
|
export NVM_DIR='$REAL_HOME/.nvm'
|
|
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
|
export NVM_NODEJS_ORG_MIRROR='$NVM_NODEJS_ORG_MIRROR'
|
|
nvm install $NODE_LTS_VERSION
|
|
"
|
|
|
|
# 验证安装结果
|
|
echo ""
|
|
echo "========================================"
|
|
echo " 安装完成!验证信息如下:"
|
|
echo "========================================"
|
|
|
|
# 以原始用户身份验证
|
|
sudo -u "$REAL_USER" bash -c "
|
|
export NVM_DIR='$REAL_HOME/.nvm'
|
|
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
|
if command -v nvm &> /dev/null; then
|
|
echo ' nvm 版本 : \$(nvm --version)'
|
|
else
|
|
echo ' nvm 版本 : n/a'
|
|
fi
|
|
if command -v node &> /dev/null; then
|
|
echo ' node 版本: \$(node -v)'
|
|
else
|
|
echo ' node 版本: n/a'
|
|
fi
|
|
if command -v npm &> /dev/null; then
|
|
echo ' npm 版本 : \$(npm -v)'
|
|
else
|
|
echo ' npm 版本 : n/a'
|
|
fi
|
|
echo ''
|
|
echo ' 当前默认使用的 Node 版本:'
|
|
nvm ls 2>/dev/null || echo ' nvm ls 不可用'
|
|
"
|
|
|
|
echo ""
|
|
echo "========================================"
|
|
echo " 提示:重新登录终端或执行:"
|
|
echo " source ~/.bashrc"
|
|
echo " 然后: nvm --version"
|
|
echo "========================================"
|