先确认执行位是否丢失:运行ls -l vendor/bin/phpunit,若显示-rw-r--r--则说明x位缺失;临时修复用chmod +x vendor/bin/* 2>/dev/null || true,windows用户应直接用php vendor/bin/phpunit调用。

vendor/bin 脚本没执行权限,怎么验证和补救
先确认是不是执行位丢了:运行 ls -l vendor/bin/phpunit。如果输出是 -rw-r--r--(没有 x),说明执行位被清空了。
临时修复:在项目根目录下执行 chmod +x vendor/bin/* 2>/dev/null || true。
- 别用
find vendor/bin -type f -exec chmod +x {} \;——它会把 README、空文件也设成可执行,CI 工具可能报 warning - Windows 用户不用折腾
chmod,直接用php vendor/bin/phpunit调用即可,无需./vendor/bin/phpunit - Git 检出后容易丢执行位,尤其从 Windows 提交的代码拉到 Linux 环境,
vendor/bin/xxx很可能变成-rw-r--r--
vendor/ 目录属主错乱,常见于 Docker 和 macOS
Docker 容器内 UID 和宿主机不一致,或 macOS 文件系统不保存 uid/gid 元数据,会导致 vendor/ 下文件属主变成 root 或 0:0。
安装时显式指定 UID/GID:composer install --uid=1001 --gid=1001。
-
docker-compose.yml中避免硬编码,用环境变量注入:user: "${UID:-1001}:${GID:-1001}" - Mac 上确保 Docker Desktop 设置里勾选了 “Use the Docker CLI from the terminal”
-
.dockerignore里漏掉vendor/是最常被忽略的点——此时 UID 参数和post-install脚本都失效,必须删掉镜像重新构建
报 Permission denied 别急着加 sudo
绝大多数错误根源不是缺权限,而是“权限错配”——文件属主是 root,而你当前是普通用户。比如 file_put_contents(/path/to/vendor/autoload.php): Permission denied,本质是所有权拦住了你。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
用 ls -ld vendor/ 看第一列和第三列:如果 owner 不是 $(whoami)(比如显示 root root),就是它了。
-
sudo chown -R $USER:$USER vendor/是解药;sudo composer install是毒药,会把新生成的文件全变成root所有 - 不要手动
chmod 777 vendor/——这会让安全扫描直接报红,且掩盖真正的属主问题 - 如果整个
~/.composer都属root,立刻执行:sudo chown -R $USER:$USER ~/.composer
如何让 post-install 自动修权限
在 composer.json 的 scripts 里加自动修复逻辑:
"post-install-cmd": ["@php -r \"if(is_dir('vendor/bin')) {foreach(glob('vendor/bin/*') as $f) {if(is_file($f) && !is_executable($f)) chmod($f, 0755);}}\""]
该脚本只作用于 vendor/bin/ 下真实存在的文件,跳过目录和符号链接,不递归。
- Windows 下这段 PHP 脚本无效,需单独处理或跳过
- 若必须保留
composer.lock且要跳过安装,可用composer install --no-scripts避免触发需要权限的脚本 - 不要依赖 Git 修权限——Git 不传执行位,它做不到
实际修复时,最容易被忽略的是:错误路径归属没查清就盲目 chmod,或者 .dockerignore 漏掉 vendor/ 导致本地已损坏的权限被复制进镜像层。










