解决mac上每次升级nodejs都要重新安装扩展包的问题

虽然有了一些新生派竞品比如yarn,但使用或者习惯了npm的开发者仍然大有人在。

以前用起来没注意到这个现象,最近一段时间发现,每次随着使用brew upgrade自动升级了nodejs版本,原来安装的nodejs扩展包就不起作用了,还需要重新安装一遍。再加上一些扩展包存储网站被墙的问题,这个过程真是令人痛不欲生。 今天比较闲了研究了一下,发现原来的扩展包都是通过npm安装到/usr/local/lib/node_modules目录。这种设置每次升级并不影响不同版本nodejs同扩展包的配合。不过因为命令行的nodejs工具没有导出到执行路径,所以无法直接运行(比如@angular/cli)。所以在当时,我曾经手工在/etc/paths中增加了搜索执行路径:/usr/local/lib/node_modules/bin。

当前的nodejs版本,使用npm安装的扩展包,已经默认安装到了nodejs安装目录之下。使用brew安装的话,这个路径通常是:/usr/local/Cellar/node/xx.xx.xx版本号/。因为不同版本位于不同目录,老版本习惯上又被清理掉了的话,那nodejs扩展包当然也要重新安装了。还有一个同时带来的烦人问题,因为这个路径经常变化,执行文件搜索路径也要每次修改。

知道了原因,解决起来也简单:

#删除掉早期的扩展包路径,这个文件夹实际上已经不使用了
#没有安装过早期版本的话,没有这个路径,当然不用删除
sudo rm -rf /usr/local/lib/node_modules

#自己建立一个扩展包安装路径
sudo mkdir /usr/local/npm
#设置权限
sudo chown $USER:admin /usr/local/npm

#让npm将扩展包安装到指定路径
echo prefix=/usr/local/npm >> ~/.npmrc

#设置执行搜索路径
sudo echo /usr/local/npm/bin >> /etc/paths

这样以后nodejs版本的升级,就不会影响扩展包了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏bisal的个人杂货铺

【每日一摩斯】-Troubleshooting: High CPU Utilization (164768.1) - 系列3

这两个进程通常是和IO相关的,但是当存在操作系统问题,这两个进程可能"spin(等待)"直到IO操作完成。这种等待是一种CPU操作。异步IO操作的缓慢或失败也能...

10940
来自专栏钱塘小甲子的博客

SUMO使用教程(六)

今天一直在设置SUMO中的交通灯,但是官方文档对具体配置文件的编辑说的很详细,但是怎么导入到其中就一笔带过了,根据上下文猜测,数次尝试也不行,最后曲线救国,毕...

18960
来自专栏bisal的个人杂货铺

一个有意思的递归定义

最近在看一本《WEB全栈工程师的自我修养》一书,其中涉及到了npm这个词的意义,非常有意思。

12620
来自专栏bisal的个人杂货铺

Oracle 12c CC安装碰见的认证问题

维护的系统增加,导致对应需要维护的开发数据库环境也增加了,为了简化管理和监控,搭建图形化管理平台,是一种不错的解决方案,我们知道,11g就有了GC(Grid C...

18430
来自专栏移动开发面面观

Future备忘录

Future是一个接口,它的主要目的,是为了我们能够方便的控制在线程中的任务的进度。在实际使用中,它常与Callable一起使用。本文主要为了理清,Java中,...

9820
来自专栏钱塘小甲子的博客

SUMO使用教程(五)

从根部往上看,用于仿真的需要rou.xml文件和net.xml文件。而net.xml文件则由上面四种文件产生。分别是nod,edg,typ,con,各自的含义...

20450
来自专栏杨熹的专栏

中文NLP笔记:4. 文本数据可视化 的几个方法

  常用的可视化形式有树状图、节点连接的网络图、力导向图、叠式图和 Word Tree 等

27020
来自专栏钱塘小甲子的博客

SUMO使用教程(二)

id就是交叉路口的名字,x,y是交叉口的坐标,不像opencv或者显示屏驱动一下,这里的坐标就是左下角是原点。

27940
来自专栏bamboo前端学习记录

使用noode.js创建一个服务器

打开gitbash,切换到js文件当前的文件夹,然后输入node index.js(index.js是我的js文件名,反正你们取什么名就输入啥名)

26020
来自专栏移动开发面面观

Thread备忘录

start()用来启动一个线程,当调用start方法后,系统才会开启一个新的线程来执行用户定义的子任务,在这个过程中,会为相应的线程分配需要的资源。

11410

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励