应执行 chmod +x vendor/bin/* 修复权限,因 composer 安装后脚本缺失执行位;需先确保已运行 composer install,再针对 vendor/bin 下所有文件添加 x 权限,避免使用 chmod -r 777 或 sudo chown。

vendor/bin 下脚本执行报 Permission denied 怎么办
不是 vendor 目录整体没权限,而是 vendor/bin/ 里那些可执行文件(比如 phpunit、laravel、symfony)缺 x 位。WSL、CI 构建或某些挂载卷环境下,composer install 解压后不会自动设执行权限,直接 ./vendor/bin/phpunit 就会失败。
- 先确认问题:
ls -l vendor/bin/ | head -n 3,看输出里有没有-rwxr-xr-x—— 如果是-rw-r--r--,说明真没执行权 - 别用
chmod -R 777 vendor/bin:这会让安全扫描工具在 CI 里直接中断构建,且没必要(只要 x 位,不用写权限) - 正确做法:
chmod +x vendor/bin/*,只加执行位,不碰读写权限 - 如果
vendor/bin/是空的或报No such file or directory,说明还没装完依赖,先跑composer install再试
为什么 composer install 后 vendor/bin 脚本没执行权限
Composer 本身不控制文件权限,它靠系统 umask 和解压工具行为决定新文件权限。Linux/macOS 上一般没问题,但以下场景会丢掉 x:
- Windows WSL 挂载 NTFS 分区(如
/mnt/c/)时,默认不支持 exec flag,得在/etc/wsl.conf加metadata=true并重启 - Docker 构建中用了
COPY --chown但没显式设0755,导致 bin 文件继承父目录权限(通常是 644) - GitHub Actions 缓存解压后保留原始权限,而缓存包是在 root 用户下生成的,解压后文件属主对不上,
x位也可能被忽略
如何让 vendor/bin 脚本权限修复自动化
手动 chmod +x 容易漏,尤其在 CI 或多人协作项目里。推荐两种稳定方案:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在
composer.json的scripts里加钩子:"post-install-cmd": "chmod +x vendor/bin/* || true"——|| true防止vendor/bin/为空时报错中断 - 用
"bin-compat": "full"配置项(放在composer.json根级):它会让 Composer 在 Windows 和类 Unix 系统上都生成带 .bat/.sh 包装器的入口,绕过原生权限问题;但注意这不替代x位,只是多一层兼容 - CI 脚本里统一加一行:
find vendor/bin -type f -exec chmod +x {} \; 2>/dev/null || true,比通配符更防错
中文路径下 vendor/bin 权限修复要额外注意什么
中文路径本身不影响权限逻辑,但容易掩盖真实问题:
- 终端显示乱码时,
ls -l vendor/bin/可能列不出文件名,误判为空 —— 改用ls -l vendor/bin/ | cat -v看原始字节,或先ls | iconv -f gbk -t utf-8(视系统编码而定) - 某些国产 Linux 发行版默认 umask 是 0002,新建文件权限为 664,
chmod +x后变成 775,组用户也能执行 —— 如果项目部署在共享服务器上,需评估是否允许组执行 - 别在中文路径里用
sudo chown -R修vendor/:一旦路径含中文,sudo可能因 locale 不一致导致归属变更失败,先切到英文 locale(LANG=C)再操作
真正麻烦的从来不是 chmod 命令本身,而是你不知道该对谁、什么时候、加哪一位权限 —— vendor/bin 下每个脚本都要单独有 x,但不能随便给 w,也不能靠删重装解决。这点比 vendor 目录所有权问题更隐蔽,也更容易在上线前漏测。










