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

时间:2012-07-10 08:13:08

标签: node.js permissions npm

上下文

我正在开发一个Node module作为CLI可执行文件安装。因此,我将其打包以供NPM使用,并advising安装它globally

问题

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

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

采取的步骤

我成功使用postinstall script创建了日志目标,同时仍然是su(mkdir log && touch log/execution.log),但这些文件由nobody拥有,并且可能无法由该工具打开。问题有所改变,但结果却完全相同。

问题

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

更具体的问题

在我的案例中你会提出什么建议?我想到了以下解决方案:

  1. 将日志文件写入执行CWD。这很难看,而且不太安全,因为CWD也不可写。
  2. 将日志文件写入预设的可写日志文件,例如~/.mytool/log,但我不喜欢用户机器上的所有传播文件。
  3. 询问用户日志文件目的地。非常讨厌。
  4. chmod 666全局日志文件。不那么丑陋但不安全。
  5. 有没有通常的做法来处理这样的问题?

2 个答案:

答案 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)

我会这样做:

  • 默认情况下登录CWD
  • 日志路径可以作为参数给出(如go -l /path/to/log
  • 如果日志文件不可写,则出错