Nvm切换Node版本同时自动切换Npm、Yarn、Pnpm的缓存地址

我们使用Nvm,在切换Node版本时,包管理工具(NpmYarnPnpm)的缓存地址并不会因为Node版本的改变而改变,
这就导致了可能因为Node版本与依赖包不兼容而导致的项目运行问题。以下Shell脚本(本地系统:MacOs 26.2 (25C56) 修改的~/.zshrc文件)

可以实现在执行 “nvm use XXX” 时,自动为每个版本的Node切换独立的缓存地址。

一、修改文件:~/.zshrc:

# 启用 Zsh 的钩子功能
autoload -U add-zsh-hook

# 统一函数:根据 Node.js 版本设置各包管理器的缓存路径
function sync_package_manager_cache {
  # 获取当前 Node 版本(去掉 'v' 前缀)
  local node_version=$(node -v 2>/dev/null | sed 's/^v//')
  
  if [ -n "$node_version" ]; then
    # 1. 设置 pnpm 存储路径
    local pnpm_store_path="$HOME/.pnpm-store/v3/node-$node_version"
    mkdir -p "$pnpm_store_path"
    pnpm config set store-dir "$pnpm_store_path" --global > /dev/null 2>&1

    # 2. 设置 npm 缓存路径
    local npm_cache_path="$HOME/.npm_cache/node-$node_version"
    mkdir -p "$npm_cache_path"
    # 通过环境变量设置(优先级最高)
    export npm_config_cache="$npm_cache_path"
    # 同时写入全局配置
    npm config set cache "$npm_cache_path" --global 2>/dev/null

    # 3. 设置 yarn (v1) 缓存路径
    local yarn_cache_path="$HOME/.yarn_cache/node-$node_version"
    mkdir -p "$yarn_cache_path"
    # 通过环境变量设置
    export YARN_CACHE_FOLDER="$yarn_cache_path"
    # 如果 yarn 已安装,也写入其全局配置
    if command -v yarn &> /dev/null; then
      yarn config set cache-folder "$yarn_cache_path" --global 2>/dev/null
    fi

    # 可选:切换时显示提示(需要提示时可取消注释下一行)
    # echo "缓存目录已切换至 Node.js $node_version 对应路径"
  fi
}

# 将函数添加到 precmd 钩子,在每次显示命令提示符前执行
add-zsh-hook precmd sync_package_manager_cache

# Shell 启动时立即执行一次,确保初始状态正确
sync_package_manager_cache

 

二、 修改保存文件以后执行生效:

source ~/.zshrc

 

三、验证是否生效:

nvm use 22
echo "Node版本: $(node -v)"
echo "npm缓存: $(npm config get cache)"
echo "yarn缓存: $(yarn cache dir 2>/dev/null || echo 'yarn未安装')"
echo "pnpm存储: $(pnpm store path)"

nvm use 24
echo "Node版本: $(node -v)"
echo "npm缓存: $(npm config get cache)"
echo "yarn缓存: $(yarn cache dir 2>/dev/null)"
echo "pnpm存储: $(pnpm store path)"

执行结果:

image

 

image

 

posted @ 2025-12-28 17:22  筑潇  阅读(0)  评论(0)    收藏  举报