NODE版本切换及仓库地址管理


title: NODE版本切换及仓库地址管理
categories:

  • 前端
    tags:
  • node
  • 工具
    copyright: ture
    ad: true
    date: 2021-11-01 09:09:04

[TOC]

版本管理

node版本管理常见的有两种nvm和n。

NVM

nvm并非包管理器,它是用于管理多个node版本的工具

在实际的开发中,可能会出现多个项目分别使用的是不同的node版本,在这种场景下,管理不同的node版本就显得尤为重要

nvm就是用于切换版本的一个工具.

使用nvm

nvm提供了CLI工具,用于管理node版本

在终端中输入nvm,以查看各种可用命令

查看本地node版本

<!-- nvm ls  // 本地版本 -->

nvm ls-remote   // 线上可下载版本
title
title

下载版本

nvm install xxx

例如 nvm install 8.0.0    下载指定版本8.0.0
title

切换版本

nvm use xxx


例如 nvm use 8.0   使用最新的8.0.x版本
title

删除版本

nvm uninstall <version>     卸载一个版本

其他命令

nvm run 6.10.3 app.js  使用6.10.3运行app.js

nvm exec 4.8.3 node app.js         使用指向4.8.3的路径运行`node app.js`   

nvm alias default 8.1.0  在shell上设置默认版本,不设置则默认是已下载的最新版本


nvm alias default node  始终默认为shell上的最新可用版本      

使用技巧

  1. 版本简写
    xxx代表需要切换的版本号,实际操作中发现可以简写,比如v10.5.0可以简写为v10,甚至写为10.如果本地同时存在12.22.5和12.19.0,nvm use 12,只会默认切换到最高版本12.22.5。

    title
  2. 全局包
    nvm有一个弊端,当你安装一些全局的包(或者本地),假设这个包是兼容的并在那个node版本上经过测试.如果你改变了node的版本,这些全局命令无法转移到新版本上.所以要么重新安装他们。

    但是nvm下载版本时提供了--reinstall-packages-from参数,来解决重新下载的问题.

    使用全局安装包的最简单的方法之就是:

    例如:
    nvm install 12.22.5 --reinstall-packages-from=10.0.0
    
    下载12.22.5版本时将10.0.0的全局模块重新下载
    

原生命令文档

我们经常使用的命令不是太多,但是我们可用的命令可是很多的,偷懒不做翻译和体验了,照搬文档过来。

命令 描述
nvm --help Show this message
nvm --version Print out the installed version of nvm
nvm install [-s] <version> Download and install a <version>, [-s] from source. Uses .nvmrc if available
--reinstall-packages-from=<version> When installing, reinstall packages installed in <node/iojs/node version number>
--lts When installing, only select from LTS (long-term support) versions
--lts=<LTS name> When installing, only select from versions for a specific LTS line
--skip-default-packages When installing, skip the default-packages file if it exists
--latest-npm After installing, attempt to upgrade to the latest working npm on the given node version
--no-progress Disable the progress bar on any downloads
nvm uninstall <version> Uninstall a version
nvm uninstall --lts Uninstall using automatic LTS (long-term support) alias lts/*, if available.
nvm uninstall --lts=<LTS name> Uninstall using automatic alias for provided LTS line, if available.
nvm use [--silent] <version> Modify PATH to use <version>. Uses .nvmrc if available
--lts Uses automatic LTS (long-term support) alias lts/*, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm exec [--silent] <version> [<command>] Run <command> on <version>. Uses .nvmrc if available
--lts Uses automatic LTS (long-term support) alias lts/*, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm run [--silent] <version> [<args>] Run node on <version> with <args> as arguments. Uses .nvmrc if available
--lts Uses automatic LTS (long-term support) alias lts/*, if available.
--lts=<LTS name> Uses automatic alias for provided LTS line, if available.
nvm current Display currently activated version of Node
nvm ls List installed versions
nvm ls <version> List versions matching a given <version>
nvm ls-remote List remote versions available for install
--lts When listing, only show LTS (long-term support) versions
nvm ls-remote <version> List remote versions available for install, matching a given <version>
--lts When listing, only show LTS (long-term support) versions
--lts=<LTS name> When listing, only show versions for a specific LTS line
nvm version <version> Resolve the given description to a single local version
nvm version-remote <version> Resolve the given description to a single remote version
--lts When listing, only select from LTS (long-term support) versions
--lts=<LTS name> When listing, only select from versions for a specific LTS line
nvm deactivate Undo effects of nvm on current shell
nvm alias [<pattern>] Show all aliases beginning with <pattern>
nvm alias <name> <version> Set an alias named <name> pointing to <version>
nvm unalias <name> Deletes the alias named <name>
nvm install-latest-npm Attempt to upgrade to the latest working npm on the current node version
nvm reinstall-packages <version> Reinstall global npm packages contained in <version> to current version
nvm unload Unload nvm from shell
nvm which [current / <version>] Display path to installed node version. Uses .nvmrc if available
nvm cache dir Display path to the cache directory for nvm
nvm cache clear Empty cache directory for nvm

n模块

还有一个node的版本管理工具很好用,n模块,他是一个npm包。

安装使用

  1. 首先安装n模块:

     npm install -g n
    
  2. 第二步:升级node.js到最新稳定版

     n stable
    

n后面也可以+版本号比如:

n v8.9.1
或
n v9.2.0

为什么不推荐使用更简单的n模块

linux和mac用户忽略

  1. 安装报错,强制安装也不行


    title
  2. 为什么呢?

    n不兼容Windows!,n不兼容Windows!,n不兼容Windows!!!

仓库源管理

nrm模块

我们解决了多个版本切换的问题,但是因为一些原因,我们还经常需要切换仓库源地址,比如npm官方源地址和私有npm仓库地址,淘宝源等等。每次使用:

npm config set registry URL

好像有点麻烦。nrm模块帮你解决问题:

  1. 安装

    npm install -g nrm
    
  2. 使用

    nrm ls  // 查看可用地址
    
    title
```
nrm use xxx  // 切换到某源,例如nrm use cnpm切换到cnpm源地址
```
![title](https://upload-images.jianshu.io/upload_images/560978-70fe572b0e8b9eeb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


```
nrm add <name> <url>  添加某源地址
```
title

之后我们使用npm install等命令安装包时其实访问的是我们设定的源地址。

版本自动切换

我们解决了node多版本切换问题,但是还有一个麻烦点在于我们不可能只开发或维护一个项目,而且多个项目并不是在每个node版本下都能运行(不然我们也没必要用版本切换工具了)。例如:项目A必须在10版本才能正常运行,B项目则在12上运行,我们同时维护开发A和B,每次都得手动切换项目,哪次忘切换了旧的报错,很麻烦。

版本自动切换我目前使用的有两种。nvm+zsh(bash)或者avn模块。

nvm + zsh(或bash)

此方法只支持mac os和linux系统,windos不行

添加脚本

使用zsh

如果您使用zsh,在您的~/.zshrc文件中添加如下脚本:

# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
  local node_version="$(nvm version)"
  local nvmrc_path="$(nvm_find_nvmrc)"

  if [ -n "$nvmrc_path" ]; then
    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")

    if [ "$nvmrc_node_version" = "N/A" ]; then
      nvm install
    elif [ "$nvmrc_node_version" != "$node_version" ]; then
      nvm use
    fi
  elif [ "$node_version" != "$(nvm version default)" ]; then
    echo "Reverting to nvm default version"
    nvm use default
  fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
title

保存退出。

使用bash
如果您使用bash,可以将其添加到您的~/.bashrc文件中:

enter_directory() {
  if [[ $PWD == $PREV_PWD ]]; then
    return
  fi

  PREV_PWD=$PWD
  [[ -f ".nvmrc" ]] && nvm use
}

export PROMPT_COMMAND=enter_directory

创建版本控制文件

在您的项目中创建.nvmrc文件,填入需要切换的版本:


title

接下来每次当您进入项目目录时,nvm会帮你自动切换到对应node版本,退出目录node版本又还原了,不用每次手动操作了。

title

avn模块

支持nvm和n的切换。但是他和上边修改命令不一样的点在于,上边方法只有进入对应目录才使用指定版本,退出目录还原默认版本。此方法进入对应目录,切换对应版本,但是退出目录,依旧是此版本,只有shell窗口重启才还原为默认。

但是,经过我在zsh+nvm+node(14.x.x)下测试,此模块目前有兼容性问题,就是您安装此模块的主版本必须是10.x.x,更高版本估计哪个依赖项有问题,后边有时间找找。

但是如果你采用nvm进行版本切换,可以借助exec命令解决问题。n应该也有对应指定版本下载的模块的方法。

官方安装(主版本高于10会出问题,截止到2021.10.31未修复)

npm install -g avn avn-nvm avn-n
avn setup

借助nvm

本地通过nvm先安装一个10.x.x的版本。本人为10.15.3

nvm exec 10.15.3 npm install -g avn avn-nvm avn-n
nvm exec 10.15.3 avn setup

使用

在项目目录撞见.node-version文件,填入需要的node版本。

现在,当您cd进入带有.node-version文件的目录时,avn将自动检测更改并使用您安装的版本管理器切换到该版本的node。

插件解释

avn 支持以下版本管理器:

nvm 通过 avn-nvm
n 通过 avn-n
nodebrew 通过 avn-nodebrew

后记

还有好多使用细节以及鉴于目前自己水平的局限性,文章不能做到万无一失和紧跟新技术发展,如有错误请大家指责并回复我,一起成长。

之后还准备写一篇npm相关的文章,和本篇文章结合起来。

欢迎大家访问我的官网
DLLCNX

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容