npm 不重启 全局安装后_npm安装全局模块碰到权限问题修复方法

前段时间比较忙,好久没更博客. 最近接了一个小项目, 使用nodejs开发后端, 由于要使用aws lambda, 全局安装SAM local时总是出现permission denied

我的环境是Ubuntu 17.10, 使用apt安装的nodejs和npm

AWS的官方文档也给出了一些方法来解决权限问题, 其中最常用的方法就是更改目录以及文件的拥有者

Ubuntu默认的npm全局模块会安装在/usr/local/lib/node_modules/, 这是因为npm的prefix变量默认设置为了/usr/local/, 可以通过下面的命令查看prefix路径1

2$ npm config get prefix

/usr/local/

默认为/usr/local/就导致一个问题, 安装全局模块就必须以root用户执行npm, 例如安装aws-sdk模块到全局:1$ sudo npm install -g aws-sdk

这个是没有问题的, 可以很正常的安装到/usr/local/lib/node_modules

根据aws的文档, 安装SAM Local时, 就会出现权限问题, 无论使用sudo, 还是su之后使用npm安装SAM Local, 都会出现权限问题, 其中的主要因素, 就是调用了go-npm这个程序, 它使用非root组的用户执行go-npm, 在写入/usr/loca/时就会导致权限问题, 具体用了哪个用户执行了go-npm, 可以在安装模块期间, 通过ps aux查看, 然后把/usr/local/的拥有者更换为这个用户, 但是这个方法我不太推荐的, 这个可能会让后来程序出现更多的权限问题

这里就采用另外一种方法, 更改prefix变量的值, 让npm把模块安装在用户目录里面, 这样就可以不用大动干戈的修改/usr/local/的拥有者.

很简单的, 只要执行下面的命令就可以实现 :1$ npm config set prefix /home/username/npm_repo

把username换成你的用户名, 路径换成自己想要存放的地方即可.

或者采用另外一种等效的方法, 创建或者修改~/.npmrc, 把下面的内容添加到文件末尾 :1prefix=/home/username/npm_repo

之后安装全局模块就不再需要sudo, 只要直接执行即可 :1

2

3

4

5

6

7

8

9

10

11$ npm install -g aws-sam-local

> [email protected] postinstall /home/username/npm_repo/lib/node_modules/aws-sam-local

> go-npm install

Downloading from URL: https://github.com/awslabs/aws-sam-local/releases/download/v0.2.2/sam_0.2.2_linux_amd64.tar.gz

/home/username/npm_repo/lib

注意到, 它会把全局模块安装在 /home/username/npm_repo/lib/node_modules, 全局模块路径变了, 你就需要修改一些东西

修改~/.bashrc, 把/home/username/npm_repo/bin加到环境变量PATH里

另外, 为了让js代码可以require到全局模块, 把/home/username/npm_repo/lib/node_modules/ 加到环境变量NODE_PATH里, 如果没有NODE_PATH, 就创建一个:1export NODE_PATH="/home/username/npm_repo/lib/node_modules"

之后重新加载 bashrc或者重启, 就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值