Permission denied主因是所有权错配而非权限不足,应执行sudo chown -R $USER:$USER vendor/ composer.lock修复归属,禁用chmod -R 777;全局缓存目录同理需chown修复。

报 Permission denied 不是权限数字太小,而是目录“不归你管”——chown 修归属,不是 chmod 硬加权限。
vendor/ 或 composer.lock 报错就锁死这两个路径
错误信息里只要出现 vendor/autoload.php、composer.lock 或 installed.json,问题一定在项目根目录下的这两个位置。别猜,直接查:
-
ls -ld vendor/—— 第三列不是你的用户名($(whoami)),说明被sudo composer install污染过 -
ls -ld composer.lock—— 同样检查属主,它常和vendor/一起被 root 占用 - 若任一输出显示
root root,就确认是所有权错配,chmod -R 777不仅无效,还会让 CI 拒绝构建、Git 提示ownership changed
修复命令(注意末尾不加 /,否则 composer.lock 文件本身可能漏掉):
sudo chown -R $USER:$USER vendor/ composer.lock
全局缓存目录 ~/.composer/cache 权限错乱
错误含 ~/.composer/cache/repo/https---packagist.org/ 或执行 composer clear-cache 失败,说明全局缓存目录也被污染了。先确认路径:
composer config --global cache-dir
再检查归属:
ls -ld $(composer config --global cache-dir)
如果第三列不是当前用户,执行:
sudo chown -R $USER:$USER $(composer config --global cache-dir)
整套 ~/.composer 都是 root?直接重置:
sudo chown -R $USER:$USER ~/.composer
Windows 下 %APPDATA%\Roaming\Composer\Cache 访问被拒
报错含 Access is denied 且路径指向 %APPDATA%\Roaming\Composer\Cache,这是 Windows ACL 权限未授予当前 PHP 用户(如你的登录账户或 IIS_IUSRS)。不能靠 chmod,得改 ACL:
- 图形界面:右键该文件夹 → “属性” → “安全” → “编辑…” → “添加…” → 输入你的用户名 → 勾选“完全控制”
- 管理员 PowerShell:
icacls "$env:APPDATA\Roaming\Composer\Cache" /grant "$env:USERNAME:(OI)(CI)F" /t - 更省事:换路径避开默认缓存目录:
composer config -g cache-dir "%USERPROFILE%\composer-cache",然后手动创建:mkdir "%USERPROFILE%\composer-cache"
vendor/bin/ 下脚本 Permission denied
Linux/macOS 执行 vendor/bin/phpunit 报错,大概率不是目录没权限,而是 ZIP 解压时丢失了可执行位(Git 不跟踪 Unix 权限)。临时解法:
chmod +x vendor/bin/phpunit
一劳永逸,在 composer.json 加脚本钩子(仅 POSIX 系统生效):
"scripts": {
"post-install-cmd": "chmod +x vendor/bin/*",
"post-update-cmd": "chmod +x vendor/bin/*"
}
Windows 用户别折腾权限——#!/usr/bin/env php 根本不认,直接用 php vendor/bin/phpunit 最稳。
真正容易被忽略的点:所有修复都必须在删掉已污染的 vendor/ 和 composer.lock 后进行;否则新旧所有权混杂,问题会反复出现。











