答案是根本原因在于zip解压丢失可执行位且git不跟踪权限,临时修复用chmod +x vendor/bin/phpunit,一劳永逸需在composer.json中配置post-install-cmd钩子自动赋权。

Composer install 本身不修改、也不控制文件权限——它只是解压 ZIP 包、写入 PHP 文件、生成 autoload 映射。你看到的权限问题,几乎全是运行环境(用户归属、umask、解压行为)导致的,不是 Composer 故意设的。
为什么 vendor/bin/ 下的脚本执行报 Permission denied
Linux/macOS 上 vendor/bin/phpunit 运行时报 Permission denied,根本不是 Composer 没“给权限”,而是 ZIP 解压时丢掉了可执行位(x),而 Git 也不跟踪文件权限变更。
- 验证方式:
ls -l vendor/bin/phpunit—— 如果显示-rw-r--r--而不是-rwxr-xr-x,就是它 - 临时修复:
chmod +x vendor/bin/phpunit或批量chmod +x vendor/bin/* - 但下次
composer install又会重置:因为 ZIP 包里没存x位,解压后自然没权 - 一劳永逸:在
composer.json的scripts里加钩子:"post-install-cmd": "chmod +x vendor/bin/*"(仅对 POSIX 系统生效)
为什么 vendor/autoload.php 报 Failed opening required
错误信息指向 vendor/autoload.php 却提示 Permission denied,大概率不是文件没读权限,而是整个 vendor/ 目录或其中某个文件属主是 root,当前用户根本打不开。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查命令:
ls -l vendor/autoload.php—— 看第一列是否为你的用户名(比如alice),而不是root - 别用
chmod 644 vendor/autoload.php:它治标不治本,下次dump-autoload就被覆盖,且vendor/composer/autoload_*.php这些动态生成文件仍属root - 正确做法:
sudo chown -R $USER:$USER vendor/(递归改所有权,不是改权限) - 连带检查:
composer.lock和~/.composer/cache/是否也被root占了
Linux/macOS 下怎么让 storage/、bootstrap/cache/ 自动可写
这类目录权限问题常见于 Laravel 部署,靠 chmod -R 775 很危险——它会把日志文件也设成可执行,CI 工具可能直接拒绝上线。
- 推荐用 PHP 脚本判断+创建+赋权,更安全:
@php -r "file_exists('storage') && is_writable('storage') || mkdir('storage', 0775, true);" - 再单独设文件权限:
chmod 664 .env(避免 .env 被 Web 访问) - 生产环境慎用
775:建议目录用755、文件用644,只对明确需写的子目录(如storage/logs)设755 - Web 服务器和 CLI 用户不同?把两者加进同一组(如
www-data),再chgrp -R www-data storage/+chmod -R g+w storage/
Windows 下 vendor/bin/ 脚本跑不起来怎么办
报“不是内部或外部命令”,这不是权限问题——Windows 根本不认 #!/usr/bin/env php,也不会自动建 .bat 包装器。
-
chmod +x或 PowerShell 的Set-ExecutionPolicy完全无效 - 最稳方案:
php vendor/bin/phpunit显式调用(绕过 shebang) - 手动补
.bat:vendor/bin/phpunit.bat内容写成:@php "%~dp0phpunit" %* - 换包:优先选自带
.bat的工具(如laravel/installer的artisan)
最容易被忽略的是:所有由 dump-autoload 动态生成的文件(比如 vendor/composer/autoload_psr4.php)都继承运行用户的 umask 和属主,一旦曾用 sudo composer,它们就全变成 root,光修 autoload.php 一个文件毫无意义。










