答案是vendor目录属主为root导致普通用户无权写入,应先用ls -ld vendor/确认归属,再执行rm -rf vendor composer.lock && composer install重装,或保留lock时加--no-scripts --no-autoloader。

vendor目录属主是root,普通用户没法写
这是最常见也最容易被误判的情况:你之前用sudo composer install跑过一次,结果整个vendor/目录树都被创建为root属主。之后再用普通用户执行任何composer命令,都会卡在file_put_contents(./vendor/autoload.php): Permission denied这类错误。
别急着chmod 777 vendor/——这会触发安全扫描告警,且掩盖了真正的归属问题。
- 先确认归属:
ls -ld vendor/,如果显示root root,就是它了 - 安全修复方式是删干净重来:
rm -rf vendor composer.lock && composer install - 如果必须保留
composer.lock(比如 CI 环境),加--no-scripts --no-autoloader跳过写文件环节
全局bin目录不可写,导致composer global require失败
运行composer global require laravel/installer时报Could not symlink: Permission denied,说明Composer试图往默认的全局bin路径(通常是/usr/local/bin)写软链,但当前用户没权限。
这不是 Composer 的 bug,而是系统级路径保护机制在起作用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 查当前全局 bin 路径:
composer config --global bin-dir - 改到用户可写位置:
composer config --global bin-dir ~/.local/bin - 确保该路径已加入
$PATH:echo $PATH检查,没包含就追加export PATH="$HOME/.local/bin:$PATH"到~/.bashrc或~/.zshrc
Windows下生成.bat文件被拦截
报Access is denied但没给出具体路径?大概率是防病毒软件(尤其是 Windows Defender 实时防护)静默阻止了vendor/bin/phpunit.bat这类批处理文件的生成。
这不是权限设置问题,而是 Windows 安全模型对可执行脚本的额外管控。
- 临时禁用杀软实时防护,再试一次
composer install - 换用 Git Bash 运行——它不走 Windows 批处理引擎,会生成 shell wrapper 而非
.bat - 若必须用 PowerShell,加
--no-scripts跳过脚本生成环节
Docker 或 WSL 中挂载目录权限错乱
在 Docker volume 挂载宿主机目录,或 WSL 访问/mnt/c/路径时,vendor/常变成只读或 UID 不匹配,mkdir(): Permission denied反复出现。
Linux 权限模型和 Windows ACL 在跨系统场景下根本不兼容。
- WSL:把项目移到
~/projects/等原生路径,避免挂载/mnt/ - Docker:不要在宿主机跑
composer install后再挂进容器;应在Dockerfile里RUN composer install - WSL 若必须用挂载,确认
/etc/wsl.conf含metadata=true,否则chown无效
cache-dir、COMPOSER_HOME或 Web 服务器写的storage/目录,它们都共享同一套归属规则。修的时候得通盘看,别只盯vendor/。










