Linux 上的 yarn install 使用 /tmp 进行可执行文件,但挂载"noexec"(权限被拒绝)



在Linux(Ubuntu 20.04(上,使用yarn 3.2.0时,出现了一个问题,即yarn安装总是会失败,并出现许多"错误";"拒绝许可";在链接步骤中,它试图使用安装在node_modules中的其他模块作为同一安装的一部分(例如node-gyp、node-gyp-build、node-pre-gyp和pre-build-install(。

经过长时间的调查(由于权限被拒绝的错误,主要集中在文件权限上(,事实上这是由于Yarn使用了/tmp文件夹,它显然在链接步骤中使用该文件夹来放置和执行一些文件。这一切都很好,但不是在Linux服务器上;最佳实践";在/tmp装载点上具有noexec标志(请参见:/opt/fstab(!noexec阻止使用可执行文件,因此权限被拒绝。如果我去掉noexec标志,纱线就会完美工作。

所以问题是,我如何绕过Yarn中的这种行为,这样我就不必破坏/tmp文件夹上的最佳实践?我已经深入研究了纱线的配置选项,但这方面似乎什么都没有。

幸运的是,Yarn尊重标准TMPDIR变量。我猜它使用的是支持这一点的标准NodeJSos.tmpdir()方法。

引用维基百科关于TMPDIR:的页面

TMPDIR是Unix和POSIX中的规范环境变量,应用于为暂存空间指定临时目录。大多数Unix程序都会遵守此设置,并使用其值来表示临时文件的暂存区,而不是常见的默认值/tmp/var/tmp

您可以轻松地执行以下操作:

mkdir ~/tmp && export TMPDIR=~/tmp && yarn install

Btw。我也经历了同样的交易,花了太多时间追逐那些奇怪的权限被拒绝的错误,却忘记了它是在/tmp中执行的。如果Yarn能够自动检测到这一点,那将是令人惊讶的。

最新更新