我正在开发一个Node module作为CLI可执行文件安装。因此,我将其打包以供NPM使用,并advising安装它globally。
但是,作为一个CLI程序,我想写一个日志文件。这在本地安装上运行良好,但在全局安装中当然不太好:NPM将程序放在/usr/local/lib/…
中,必须以sudo
运行才能在那里写。
然后,当用户尝试运行该工具时,由于EACCES
而失败:无法创建日志文件夹和文件。
我成功使用postinstall
script创建了日志目标,同时仍然是su(mkdir log && touch log/execution.log
),但这些文件由nobody
拥有,并且可能无法由该工具打开。问题有所改变,但结果却完全相同。
有没有办法让NPM模块有权在自己的目录中写入?
在我的案例中你会提出什么建议?我想到了以下解决方案:
~/.mytool/log
,但我不喜欢用户机器上的所有传播文件。chmod 666
全局日志文件。不那么丑陋但不安全。有没有通常的做法来处理这样的问题?
答案 0 :(得分:1)
不,没有办法在自己的目录中为全局安装的Node模块提供写入权限。
实际上,为了允许全局安装,即能够在/usr/local/lib
中写入,NPM必须通过sudo
以root身份运行。但是,在这样做时,NPM将downgrade its user to nobody
:
从版本0.3开始,建议以root身份运行npm。这允许npm在运行任何包构建或测试命令之前将用户标识符更改为
nobody
用户。
所有package scripts都以nobody
运行,因此无法覆盖此设置。
这是一项安全功能,可以防止对已安装模块进行任何未经授权的安装后修改,使安装的模块可信任。
您应该尝试在业务逻辑中找到对您的日志有用的默认位置。定义用户可覆盖的(通过CLI交换机)全局可写日志(例如~/.yourTool/log
)会很好,但Node不会扩展~
,因此找到跨平台的全局日志记录目标似乎有点困难。
答案 1 :(得分:0)
我会这样做:
go -l /path/to/log
)