上周我在做一个个人项目,当我尝试编译我的 Sass 文件时,遇到一个奇怪的错误。 不幸的是,我没有截取错误的屏幕截图,但它类似于以下内容
Failed to write to location cssmin: style.css EACCES
该 EACCES 代码让我不知所措,但我能够推断出这是一个文件权限问题,因为错误描述指出它无法写入文件,并且通过一些快速的 StackOverflow 搜索。
我找不到很多关于如何解决此问题的答案,所以我尝试自己修复它。 我发现许多论坛帖子建议这可能是 Node 的权限问题,所以我经历了重新安装它的痛苦过程,结果却更糟糕,因为终端甚至无法找到 npm
或 grunt
任务。
最后,我不得不联系一位朋友(感谢 Neal!)来解决问题。 我想记录一下他带我经历的过程,以防将来帮助其他人。
我要先说明一下,我在使用 Mac。 也就是说,我不确定这里涵盖的内容是否普遍适用于所有平台。
重新安装 Node
在与 Neal 交流之前,我已经通过 nodejs.org 上的安装程序包重新安装了 Node。
有人告诉我,在我的项目中,直到我再次使用包管理器重新安装 Node,我的权限问题很可能会再次出现。 有些人使用 Homebrew,虽然我在论坛上看到了一些反对它的原因。 Node 版本管理器 看起来是一个不错的选择,因为它专门设计用于管理同一台机器上的多个 Node 版本,这使得将来的安装和项目中的版本切换变得容易。
设置指向 Node 模块的路径
安装完 Node 后,我以为我可以将终端指向我的项目
cd /path/to/my/project/folder
…然后安装我在项目的 package.json
文件中添加的 Node 模块
npm install
结果,我得到了以下结果
npm: command not found
糟糕。 我不是刚刚重新安装了 Node 吗?
事实证明,终端(更准确地说,我的系统总体上)对 Node 的安装位置做出了假设,需要告知它在哪里查找。
我通过打开系统的 .bash_profile
文件并在其中添加路径来解决这个问题。 你可以变得更专业一点,使用类似以下命令的工具在终端中打开文件
touch .bash_profile
open .bask_profile
或者像我一样,直接使用代码编辑器打开它。 它是一个隐藏文件,但大多数代码编辑器会在文件夹面板中显示这些文件。 该文件应该位于你的用户目录中,类似于 Macintosh HD > Users > Your User Folder
。
这是我添加的内容,以确保 Node 被引用到正确的位置
export PATH="$HOME/.npm-packages/bin:$HOME/.node/bin:$PATH"
这实际上是告诉系统去 .npm-packages/bin/
目录中查找 Node 命令。 事实上,如果我浏览到该文件夹,确实可以看到我的 NPM 和 Grunt 命令,这两个命令以前终端都无法找到。

有了这个小片段并将其保存到 .bash_profile
中,当我再次尝试安装我的 Node 模块时,我兴奋不已
cd /path/to/my/project/folder
npm install
…并看到一切按预期加载!
更新权限
我的命令又可以正常运行了,但我仍然得到与本文开头相同的 EACCES
错误。
问题是,项目文件夹最初是作为 Root 用户创建的,这可能是我在终端使用 sudo
执行其他操作时造成的。 结果,使用我的用户帐户运行 Grunt 任务不足以让 Grunt 拥有写入这些文件夹的权限。
我将目录更改为 Grunt 尝试写入 style.css
文件的文件夹,然后检查该文件夹的权限
cd /path/of/the/parent/directory
ls -al
这将显示该目录中所有文件和文件夹的权限。 它显示该文件夹的权限实际上没有为我的用户帐户设置写入该文件夹的权限。 我将目录更改为该特定文件夹,并使用以下命令将自己设为所有者(当然,将 username 替换为我的用户名)
sudo chown -R username:staff
我再次运行 Grunt 任务,结果一切顺利,编译并保存,如我所愿。
总结
我知道我遇到的问题可能只属于我,或者是我自己造成的,但我希望这能帮助其他人。 作为一个网页设计师,命令行对我来说可能令人生畏甚至有点可怕,即使我觉得我应该熟悉依赖于它的工具。
我们有像 StackOverflow 这样的社区驱动网站,这很棒,在我们需要的时候可以依靠它们。 同时,寻求个人帮助往往是不可替代的。
编程的未来将是减少代码编写,更多地处理配置,这令人沮丧得多。 对于较新的工具来说尤其如此,并且会让很多人望而却步。 希望配置也能变得更简单。
此外,始终准备一份权限终端配方手册。
你有任何好的权限配方手册可以分享吗? 那太棒了:D
@thomas 这是我最常用的命令。 我在项目根目录下运行它。 注意不要在服务器根目录下运行它。 你可能需要将 ./ 替换为完整路径,以防止错误。 对文件设置 664,对目录递归设置 775,并将所有权赋予 www-data 和 goose(我的 Linux 用户,将其更改为你的 Linux 用户)。 www-data 是 Ubuntu 上默认的 Web 用户,你可能需要不同的 Web 用户。 你可能需要 644 和 755 代替。 在极少数情况下,你可能会发现某些文件需要特殊权限,例如 bash 或 index.php 文件。