如何写入全局安装的Node模块中的文件?

上下文

我正在开发一个作为CLI可执行文件安装的Node模块 。 因此,我打包使用NPM, build议 全球安装。

问题

但是,作为一个CLI程序,我想写一个日志文件。 这在本地安装中工作正常,但在全局安装中当然不太好:将程序放在/usr/local/lib/… ,NPM必须以sudo身份运行。

然后,当用户尝试运行该工具时,由于EACCES而失败:日志文件夹和文件无法创build。

采取的步骤

我成功地使用了postinstall脚本来创build日志目的地,同时仍然是su( mkdir log && touch log/execution.log ),但这些文件被nobody拥有,并且可能不会被该工具打开。 问题转移了一下,但结果是完全一样的。

有没有办法让NPM模块有权在自己的目录中写入?

更具体的问题

你会怎么build议我的情况? 我想到了以下解决scheme:

  1. 在执行CWD中写入日志文件。 这是丑陋的,并不安全,因为CWD也不可写。
  2. 将日志文件写入预设的可写日志文件,如~/.mytool/log ,但我不喜欢遍布用户的机器传播文件。
  3. 询问用户一个日志文件的目的地。 非常讨厌。
  4. chmod 666全局日志文件。 不丑,但不安全。

处理这个问题有没有普遍的做法?

不,没有办法在自己的目录中向全局安装的Node模块提供写入权限。

实际上,为了允许全局安装,即能够写入/usr/local/lib ,NPM必须通过sudo以root身份运行。 但是,在这样做的时候,NPM会把用户降级到nobody

从版本0.3开始,build议以root身份运行npm。 这允许npm在运行任何包构build或testing命令之前将用户标识符更改为nobody用户。

所有包脚本都以nobody运行,因此无法覆盖此设置。

这是一项安全function,可以防止任何未经授权的安装后修改已安装的模块,从而使已安装的模块值得信赖。


你可能应该试着find你的日志的默认位置,在你的业务逻辑中是有意义的。 定义一个用户可覆盖的(通过CLI开关)全局可写日志,如~/.yourTool/log会很好,但Node不会扩展~ ,所以find一个跨平台的全局日志logging目录似乎有些困难。

我会这样做:

  • 作为默认loginCWD
  • 日志path可以作为参数给出(如go -l /path/to/log
  • 如果日志文件不可写,则会出错