.npm 文件夹的备用位置(以避免安装 NFS 的主目录)

Posted

技术标签:

【中文标题】.npm 文件夹的备用位置(以避免安装 NFS 的主目录)【英文标题】:alternate location for .npm folder (to avoid NFS-mounted home) 【发布时间】:2013-02-20 22:00:33 【问题描述】:

我有一个 NFS 挂载的主文件夹,我正在尝试通过 npm 设置全局包,例如:

sudo npm install -g jshint

这给了我一个错误,因为在 sudo 下我无法在远程服务器上创建任何东西(在 npm 之外尝试过)

npm ERR! Error: EACCES, open '/home/explunit/.npm/a02a2468-jshint.lock'
npm ERR!   [Error: EACCES, open '/home/explunit/.npm/a02a2468-jshint.lock']
npm ERR!   errno: 3,
npm ERR!   code: 'EACCES',
npm ERR!   path: '/home/explunit/.npm/a02a2468-jshint.lock' 
npm ERR! 
npm ERR! Please try running this command again as root/Administrator.

我确信有人会在 2 分钟内出现并说“不要使用 sudo ——真正的开发人员会明白如何在没有它的情况下设置 node/npm!”,但是 a) 我一直不清楚鉴于npm readme 建议使用 sudo,这是如何设计的,并且 b) 在这种情况下,我真的不想要任何与我的特定用户相关的东西(它是一个构建服务器)

所以我想真正的问题是如何让 npm 忽略我的主文件夹并为 .npm 使用其他位置?

【问题讨论】:

您可以将主目录中的.npm 替换为指向可写的非nfs 位置的符号链接。 【参考方案1】:

尝试用这个改变缓存的位置。

npm config set cache /SOMEWHERE/ELSE

/SOMEWHERE/ELSE 应该是运行命令的用户可以写入的地方。

【讨论】:

谢谢,但看起来这在“sudo npm install -g some_package”场景中仍然无法解决它,因为 sudo 不会查看用户的本地 npm 配置 sudo npm -g config get cache 仍然给我~/.npm。缓存只是为了最大限度地减少您需要再次下载的内容。你试过了还是没用? 是的,尝试了你的命令,然后是我上面原始问题中的命令,得到了同样的错误。但是,看起来有一个 --global 可以放在命令的末尾,这将使其甚至适用于 sudo 环境设置。在别处设置 tmp 也需要类似的命令 对我没有帮助,因为这个命令本身正在尝试创建~/.npmrc,而写入~正是我想要避免的。 npm_config_userconfig=/tmp npm ... 将使用 /tmp 作为 .npmrc 的位置【参考方案2】:

我还遇到了在 nfs 挂载上执行 npm 的问题,对我来说,问题是,nfs 挂载不是可执行的,这通常适用于存储位置,因为它可以保护您免于执行从其他地方下载的潜在危险代码。

尽管如此,有时您还是需要从 nfs 挂载上执行脚本。我建议使用单独的挂载点,然后挂载可执行文件。

这可以通过以下方式达到:

检查您的安装选项:
挂载 | grep nfs

其中列出了您的 nfs 挂载,例如:

设备挂载点 nfs (rw,noexec,nosuid,nodev,nolock,addr=...)
仔细查看选项部分。如果列出了“noexec”选项,则无论您使用 chmod 设置什么文件权限,您都无法从那里执行某些代码。

所以在 'etc/fstab' 中,而不是例如

设备挂载点 nfs rw,nolock,用户

使用

设备挂载点 nfs rw,nolock,exec

('exec' 和 'users' 选项可能会相互干扰,如果需要,请参阅 'mount' 手册页以了解它们的正确顺序)

【讨论】:

以上是关于.npm 文件夹的备用位置(以避免安装 NFS 的主目录)的主要内容,如果未能解决你的问题,请参考以下文章

在链接备用标签中使用 hreflang 来建议特定于区域的替代品是不是正确,以避免它们被确定为重复项? [关闭]

nfs服务安装配置

避免同时写入 NFS 共享文本文件

更改npm全局模块和cache默认安装位置

Nodejs安装后修改全局路径配置

如何避免物理磁盘 I/O