最近在使用npm过程中,发现全局安装总会遇到permission相关的错误,所以总是要在前面加sudo,还得不停输入密码。

懒惰使我进步,随手google了一下相关问题的解决方案,发现npm在官方文档中早有明示How to Prevent Permissions Errors。据其描述,根本原因其实是Node.js安装包将程序安装在了一个只有local permissions的地址上(写入是需要管理员权限的)。而其提供了两种修复的方式,其中的推荐方式既是本文要说的nvm的方式。

nvm的优势

nvm(Node Version Manager)通过对node和npm集中的版本管理主要解决了两个问题

  1. 统一解决了node和npm版本管理的问题,nvm提供了很方便的机制可以使我们在同一终端上安装多个版本的node和npm并且提供了快速切换版本的能力,这样为我们检测项目兼容性和bug定位提供了很大的帮助。
  2. 解决了本文一开始提到的种种permission的相关问题,自此再也不用重复输入sudo来进行全局安装。

nvm的使用

这里简单介绍一下nvm在MacOS下的安装和使用(注,nvm主要还是面向mac os和linux用户,使用windows的客官请看这里

安装之前

在安装之前,首先应该需要考虑一下是否要保留原有的系统安装的node。nvm是可以保留原有node来安装的,也提供了切回system node的方式。

但是要注意
如果系统中存在多用户,那么当前安装的nvm是只针对你的,其它用户如果没有安装则只能使用到系统安装的node版本。两者全局安装的node modules地址是不相同的(/usr/local/lib/node_modules/* VS ~/.nvm/versions/node/vX.X.X/lib/node_modules/*)。一定程度上是有版本不一致的风险的。

如果选择卸载原有系统node,这里有一篇很实用的讲解

安装

安装方式比较简单,只要执行以下的脚本。脚本clone了项目代码,并进行了环境变量的设置。如果出现问题可以查看github上的trouble shooting。

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

在安装完后,关掉终端重开一个新的,输入以下指令验证安装。

command -v nvm # should return nvm

注:可以使用同一脚本来自动更新nvm

使用

安装完后,使用起来就非常简单明快了,以下是一些常用功能

1. 安装某一版本的node nvm install

nvm install --lts #安装最新的lts版本的node nvm install node #安装最新版本的node nvm install 6.14.4 #安装node版本6.14.4

2. 列出所有node版本

nvm ls #本机所有版本 nvm ls -remote #远端所有版本

3. 切换、使用某一版本的node nvm use

nvm use --lts #使用最新的lts版本的node nvm use node #使用最新版本的node nvm use 6.14.4 #使用node版本6.14.4

4. 启动node nvm run

nvm run --lts #启动最新的lts版本的node nvm run node #启动最新版本的node nvm run 6.14.4 #启动node版本6.14.4

5. 使用某一版本执行

nvm exec 4.2 node --version

6. 查询某一版本的安装位置

nvm which 5.0

node, --lts都是nvm自动维护的别称,表示最新版本和最新的long-term support版本。
另,system同样也是别称,表示node的非nvm安装的system版本

关于既有的node modules

可以使用--reinstall-packages-from=node来自动在新的node中安装上一版本已有的node modules

nvm install node --reinstall-packages-from=node #从上一版本继承 nvm install 6 --reinstall-packages-from=5 #从某一版本继承

关于镜像

很神秘的是nvm windows很贴心的提供了命令行设置镜像的命令,而mvn木有,所以只好手动来。

nvm node安装镜像

1 手动方案,每次执行nvm安装时,执行

export NVM_NODEJS_ORG_MIRROR=https://nodejs.org/dist nvm install node

2 永久方案,当然是将export放到~/.bashrc

npm镜像

npm install的安装速度也是很感人的。所以,安装完node一般会把npm的镜像也设置成淘宝滴。

npm config set registry https://registry.npm.taobao.org

注:劝君莫用cnpm,与npm基本无异,然而经常会出一些想不到的bug。

卸载

nvm的卸载是手动完成的,但是不复杂。

首先,删掉nvm文件

$ rm -rf "$NVM_DIR"

随后,修复环境变量,修改~/.bashrc (如果没有就去bash_profile找找),删掉以下这几行

export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [[ -r $NVM_DIR/bash_completion ]] && \. $NVM_DIR/bash_completion

搞定。

总结

mvn提供了一种管理Node.js版本的便捷方式,不管是安装、切换、删除都可以一步到位,无疑是现阶段的首选。

原文地址:https://segmentfault.com/a/1190000016899030

基于nvm的Node、NPM的版本管理(NPM permission error的解决)的更多相关文章

  1. nvm管理node之后,安装npm包出现的问题

    在学习Node.js连接MySQL时,使用nvm安装node6.10.0,在项目目录下npm install mysql 出问题. 在查询解决方法后,得知是因为配置文件有问题 package.json ...

  2. mac使用nvm安装node进行多版本管理

    安装 $ git clone https://github.com/creationix/nvm.git ~/.nvm $ source ~/.nvm/nvm.sh vi ~/.bash_profil ...

  3. node 报错 throw er; // Unhandled 'error' event 解决办法

    node 报错 Starting child process with 'node web.js' events.js:183 throw er; // Unhandled 'error' event ...

  4. nvm、node、npm安装以及pycharm配置eslint

    nvm.node.npm之间的区别 1. nvm的官方叫法:nodejs版本管理工具. nvm相当于是家长,一个家长可以管理多个孩子. 也就是说:一个nvm可以管理很多node版本和npm版本. 2. ...

  5. 使用nvm管理node版本时,各个版本下公用npm安装的插件问题

    因为使用了NVM(node版本管理工具),所以在切换node版本的时候安装的插件不能共享使用,必须重新安装,导致不必要的工作量 所以我将npm(node包管理工具提取出来) 进行node版本之间的共享 ...

  6. 使用nvm安装node,全局npm,cnpm

    1.nvm-windows下载 下载地址https://github.com/coreybutler/nvm-windows/releases,下载nvm-setup.zip 2.安装nvm 首先把n ...

  7. nvm安装node和npm,个人踩坑记录

    我采用nvm-setup安装windows版本的nvm nvm安装node出现的问题: 1.node成功了,npm没成功 解决:在nvm 安装了node之后,输入npm找不到该命令,当时安装报错如下: ...

  8. 使用nvm管理node.js版本以及更换npm淘宝镜像源

    目录 1,前言 2,安装nvm 3,nvm的使用 4,错误处理 5,修改npm默认镜像源 6,win10下cnpm报错 1,前言 注意:此教程仅限Windows,Mac可能不适用 在我们的日常开发中可 ...

  9. npm常用命令学习(npm install -D,semver版本规范, npm进行版本管理的最佳实践用法)

    什么是npm npm有两层含义.一层含义是Node的开放式模块登记和管理系统,网址为npmjs.org.另一层含义是Node默认的模块管理器,是一个命令行下的软件,用来安装和管理Node模块. npm ...

随机推荐

  1. bzoj 4823: [Cqoi2017]老C的方块【最大权闭合子图】

    参考:https://www.cnblogs.com/neighthorn/p/6705785.html 并不是黑白染色而是三色染色(还有四色的,不过是一个意思 仔细观察一下不合法情况,可以发现都是特 ...

  2. bzoj 3930: [CQOI2015]选数【递推】

    妙啊 这个题一上来就想的是莫比乌斯反演: \[ f(d)=\sum_{k=1}^{\left \lceil \frac{r}{d} \right \rceil}\mu(k)(\left \lceil ...

  3. 洛谷P4114 Qtree1(树链剖分+线段树)

    传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 //minamoto #include& ...

  4. 初窥MySQL性能调优

    本文涉及:MySQL自带的性能测试工具mysqlslap的使用及几个性能调优的方法 性能测试工具—mysqlslap mysqlslap是MySQL自带的一款非常优秀的性能测试工具.使用它可以 模拟多 ...

  5. UVA 10462 Is There A Second Way Left? (次小生成树+kruskal)

    题目大意: Nasa应邻居们的要求,决定用一个网络把大家链接在一起.给出v个点,e条可行路线,每条路线分别是x连接到y需要花费w. 1:如果不存在最小生成树,输出“No way”. 2:如果不存在次小 ...

  6. Bryce1010的微机接口课设

    8086CPU知识回顾 8086 CPU 中寄存器总共为 14 个,且均为 16 位 . 即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个. 而 ...

  7. 判素数+找规律 BestCoder Round #51 (div.2) 1001 Zball in Tina Town

    题目传送门 /* 题意: 求(n-1)! mod n 数论:没啥意思,打个表能发现规律,但坑点是4时要特判! */ /***************************************** ...

  8. set和get方法

    package day02; public class Person { /**为了封装,一般的属性都设置成为private(私有的),所以你无法用 .属性 的方式来得到属性值, * 因此此时用两个p ...

  9. java垃圾回收体制

    JVM分代垃圾回收策略的基础概念 为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程 ...

  10. javascript 笔记--变量

    用了这么久的Javascript,该总结下了!温故而知新! var 声明变量: javascript 是弱类型语言,因此无需为声明对象明确类型声明. 如:var test="字符串" ...