Node.js 如何在全局安装的节点模块中写入文件? 上下文
我正在开发一个安装为CLI可执行文件的。因此,我将其打包,以便与NPM一起使用,并安装它 问题 但是,作为CLI程序,我希望写入日志文件。这在本地安装上运行良好,但在全局安装中当然不太好:NPM将程序放置在Node.js 如何在全局安装的节点模块中写入文件? 上下文,node.js,permissions,npm,Node.js,Permissions,Npm,我正在开发一个安装为CLI可执行文件的。因此,我将其打包,以便与NPM一起使用,并安装它 问题 但是,作为CLI程序,我希望写入日志文件。这在本地安装上运行良好,但在全局安装中当然不太好:NPM将程序放置在/usr/local/lib/…中,它必须以sudo运行才能在那里编写 然后,当用户尝试运行该工具时,由于EACCES:无法创建日志文件夹和文件而失败 采取的步骤 我成功地使用创建了日志目的地,同时仍然使用su(mkdir log&&touch log/execution.log),但这些文件
/usr/local/lib/…
中,它必须以sudo
运行才能在那里编写
然后,当用户尝试运行该工具时,由于EACCES
:无法创建日志文件夹和文件而失败
采取的步骤
我成功地使用创建了日志目的地,同时仍然使用su(mkdir log&&touch log/execution.log
),但这些文件随后归任何人所有,并且可能无法被工具打开。问题有点转移,但最终还是一样的
问题:
有没有办法赋予NPM模块在其自己的目录中写入的权限?
更具体的问题
你对我的情况有什么建议?我想到了以下解决办法:
在执行CWD中写入日志文件。这很难看,也不太安全,因为CWD也不能写
将日志文件写入预设的可写日志文件,例如~/.mytool/log
,但我不喜欢将文件散布到用户的机器上
向用户询问日志文件目标。非常烦人
chmod 666
全局日志文件。不那么丑陋但不安全
是否有处理此类问题的常规做法?我希望:
- 默认登录CWD
- 日志路径可以作为参数给出(如
go-l/path/to/Log
)
- 如果日志文件不可写,则出错
我希望:
- 默认登录CWD
- 日志路径可以作为参数给出(如
go-l/path/to/Log
)
- 如果日志文件不可写,则出错
否,无法将自己目录中的写入权限授予全局安装的节点模块
实际上,为了允许全局安装,即能够在
/usr/local/lib
中写入,NPM必须作为root用户通过sudo
运行。但是,在这样做时,NPM将:
从版本0.3开始,建议以root用户身份运行npm。这允许npm在运行任何包构建或测试命令之前将用户标识符更改为nobody
用户
所有都以无人身份运行,因此无法覆盖此设置
这是一项安全功能,还可防止对已安装模块进行任何未经授权的安装后修改,从而使已安装模块变得可信
您可能应该尝试为日志找到一个在业务逻辑中有意义的默认位置。定义一个用户可重写(通过CLI开关)的全局可写日志,如~/。您的工具/log
会很好,但节点不会展开~
,因此查找跨平台全局日志目标似乎有点困难。否,无法将自己目录中的写入权限授予全局安装的节点模块
实际上,为了允许全局安装,即能够在/usr/local/lib
中写入,NPM必须作为root用户通过sudo
运行。但是,在这样做时,NPM将:
从版本0.3开始,建议以root用户身份运行npm。这允许npm在运行任何包构建或测试命令之前将用户标识符更改为nobody
用户
所有都以无人身份运行,因此无法覆盖此设置
这是一项安全功能,还可防止对已安装模块进行任何未经授权的安装后修改,从而使已安装模块变得可信
您可能应该尝试为日志找到一个在业务逻辑中有意义的默认位置。定义一个用户可重写(通过CLI开关)的全局可写日志,如~/。您的工具/log
会很好,但节点不会展开~
,因此查找跨平台全局日志目标似乎有点困难。仍然是这样吗?@roecruw什么?NPM仍然降级?是:。该节点不展开~
?是:只需在终端上键入node-e'console.log(需要(“路径”).resolve(“~”)
。仍然是这样吗?@roecruw什么?NPM仍然降级?是:。该节点不展开~
?是:只需在终端上键入node-e'console.log(需要(“路径”).resolve(“~”)
。