答案是紧盯报错中明确写出的路径,如/home/user/project/vendor或/opt/myapp/storage/logs,用ls -ld检查归属,若属主非当前用户则执行sudo chown -r $user:$user修复,禁用chmod -r 777。

composer install 报 mkdir() Permission denied,先盯住错误里的路径
终端报错里一定带具体路径,比如 mkdir(): Permission denied 后跟着 /home/user/project/vendor 或 /opt/myapp/storage/logs。这个路径就是真实失败点——不是 vendor 本身,而是它父目录或某个子目录(如 storage/cache)被锁死了。别猜,直接用 ls -ld /opt/myapp/storage 看归属和权限位,第三列不是 $(whoami) 就是所有权问题;若显示 drwxr-xr-x 2 root root,那 mkdir 失败就毫无悬念。
自定义路径(如 storage/、bootstrap/cache)属主是 root?立刻归还,别碰 chmod
常见于 Laravel 项目里手动 sudo php artisan storage:link 或用 root 运行过部署脚本,导致 storage/ 下的子目录全归了 root。此时 composer install 在生成 autoload 或写缓存时会卡在 mkdir(storage/framework/cache)。
- 确认当前用户:
whoami - 修复整个目录树:
sudo chown -R $USER:$USER storage/ bootstrap/cache/(注意末尾斜杠,确保递归生效) - 不推荐
chmod -R 775 storage/:它可能让 Web 服务器(如 nginx)误读为“可执行”,触发安全拦截;且无法解决file_put_contents类写入失败的根本原因
COMPOSER_HOME 或 cache-dir 指向系统路径?重定向到用户空间
如果 composer config --global home 输出是 /usr/local/share/composer 或 /var/www/.composer,说明全局配置被污染——Composer 会试图往这些 root-only 目录写缓存、插件甚至 auth.json,mkdir() 必然失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查当前缓存路径:
composer config --global cache-dir - 强制改回用户目录:
composer config --global cache-dir ~/.composer/cache - 确保路径存在且可写:
mkdir -p ~/.composer/cache && sudo chown -R $USER:$USER ~/.composer - 若
COMPOSER_HOME环境变量被硬编码成系统路径,临时清除:unset COMPOSER_HOME,再验证composer config --global home是否回归$HOME/.composer
Docker 或 WSL 中挂载路径导致 mkdir 失败?绕过宿主机权限模型
在 Docker volume 挂载 /host/project:/app 或 WSL 访问 /mnt/c/Users/xxx/project 时,Linux 的 mkdir() 调用会被 Windows ACL 或 NTFS 元数据拦截,报错但不提示真实原因。
- WSL:检查
/etc/wsl.conf是否含[automount]\nmetadata=true,没有就加上并重启 WSL - Docker:避免在容器外运行
composer install—— 改用Dockerfile内RUN composer install,让所有操作发生在容器内文件系统 - 临时验证:把项目移到 WSL 原生路径(如
~/projects/myapp),再跑composer install;若成功,问题就锁定在挂载机制
真正棘手的是错误路径指向一个看似无关的临时目录——比如 mkdir(/tmp/composer_archive_abc123) 失败,这往往意味着系统 /tmp 被挂载为 noexec 或 nosuid,而 Composer 默认用它解压包。这种情况下,chown 无效,得改 Composer 的临时目录:export COMPOSER_CACHE_DIR="$HOME/.composer/cache" && export TMPDIR="$HOME/tmp",再运行命令。










