以非root用户身份运行Gulp时出现EPERM错误

8

我在一个简单的WordPress主题项目中使用Gulp来编译一些资产。

当我运行编译一些LESS文件的Gulp任务时,出现以下错误:

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
Error: EPERM, chmod '/Users/harryg/Sites/sites/wordpress/wp-content/themes/samarkand-2/assets/css/main.min.css'

当我以sudo运行时,任务可以正常执行。
考虑到这可能是一个权限错误,我将整个主题文件夹及其内容的权限都更改为777,但这并不能解决问题。我已经全局安装了gulp,这可能是问题所在,但我不确定如何解决。
编辑
即使我运行本地的gulp,我也会遇到同样的错误。也就是说,从我的项目文件夹中运行node_modules/.bin/gulp会产生相同的EPERM错误。

我不知道答案,但你应该避免以root身份运行gulp,这有点危险。相反,将项目目录的权限设置为777(即 '/Users/harryg/Sites/sites/wordpress/wp-content/themes/samarkand-2')。 - Tom
@Tom将chmod更改为777也很危险。 - GusDeCooL
在我的情况下,package.json 中的一些包版本较旧,我必须安装最新版本。 - Marian07
3个回答

2
`sudo chown -R `whoami` sites/wordpress/wp-content/themes/samarkand-2` 

应该修复它。或者您想要从哪个目录开始。这不是危险的,可能是由于您的node安装而引起的。这是非常普遍的,通常在使用npm@3.X.X运行安装后应该进行修复。


2
虽然@cwelske在他的回答中提供了一个“hacky”的解决方法,但他提供的错误报告链接为Gulp 3提供了更好的修复方法:使用vinyl-fs

npm install vinyl-fs --save-dev

修改你的gulpfile文件以使用VFS:

在你的requires块中添加:var vfs = require('vinyl-fs');

修改你的输出管道:.pipe(vfs.dest('./output'));

我面临这个错误的原因是文件由一个更通用的组和用户拥有,以便多个团队成员可以一起工作。显然Ubuntu不允许您chmod别人的文件。我怀疑OP处于类似的情况下(Web服务器可能拥有这些文件)。

如果您不需要这种设置,另一种选择是将文件更改为属于您的用户,例如:

sudo chown -R me:me .

将文件权限设置为777是没有帮助的,因为除非你拥有该文件,否则你无法在没有sudo的情况下进行chmod操作。(因此,当你使用sudo运行gulp时它才能生效。)

vinyl-fs 在 nodejs v10.19.0 中无法工作,gulp -v CLI 版本为2.3.0,本地版本为4.0.2。 - SL5net

1

gulp 3.x 存在一个错误,即使文件已经具有所有必需的权限,它也会想要chown所有文件。这个问题在gulp 4中被修复了。

如果您知道文件具有正确的权限,则相关错误包含一个不错的解决方法:只需在您的gulpfile.js中将fs.chmod替换为空函数即可:

var fs = require('fs');
if (1) fs.chmod = function (a, b, cb) {
    cb(0);
}

这在 Node.js v10.19.0 上不起作用,gulp -v CLI 版本:2.3.0 本地版本:4.0.2 - SL5net

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接