如何写入全局安装的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:
- 在执行CWD中写入日志文件。 这是丑陋的,并不安全,因为CWD也不可写。
- 将日志文件写入预设的可写日志文件,如
~/.mytool/log
,但我不喜欢遍布用户的机器传播文件。 - 询问用户一个日志文件的目的地。 非常讨厌。
-
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
) - 如果日志文件不可写,则会出错