中文镜像导致钩子脚本找不到包的根本原因是镜像源返回的 packages.json 缺少 provider-includes 或元数据不全,使 composer 误判工具包未安装成功,实际 vendor/bin/ 文件存在但类加载失败。

中文镜像导致钩子脚本找不到包二进制
不是镜像本身有问题,而是镜像源返回的 packages.json 缺少 provider-includes 或元数据不全,导致 Composer 误判某些工具包(如 php-cs-fixer、phpstan)未安装成功,实际 vendor/bin/ 下文件存在但依赖类加载失败。
常见错误现象:composer run-script fix 报 Class not found,但 ls vendor/bin/php-cs-fixer 确实存在;或 sh: php-cs-fixer: not found —— 这说明 shell 找不到可执行文件,根源是 Composer 没把包正确解压进 vendor/bin/,而原因常是镜像没同步完整 provider 数据。
- 确认镜像是否支持 provider-includes:私有 Satis 源必须生成
provider-includes字段,否则每次拉全量packages.json,体积大且易漏包 - 临时切回官方源验证:
composer config repo.packagist composer https://packagist.org,再composer install --no-cache - 阿里云镜像(
https://mirrors.aliyun.com/composer/)目前稳定支持 provider 分片,比已停更的 phpcomposer 镜像更可靠
钩子执行时机与镜像无关但常被误归因
post-install-cmd、pre-autoload-dump 等钩子是否运行,和用哪个镜像完全无关。它们只取决于 vendor/ 是否重建、composer.lock 是否变更、以及是否启用 --no-scripts。
真实场景里,开发者在 CI 中用了中文镜像后发现钩子不执行,其实是 CI 脚本里加了 --no-scripts,或者本地 vendor/ 已存在、composer.lock 未变,导致 Composer 直接跳过安装流程。
-
post-install-cmd只在真正重装vendor/时触发,不是每次composer install都跑 - CI 默认常带
--no-scripts,需显式去掉或改用composer install --no-interaction - 检查
scripts是否写在composer.json顶层,而非嵌套在extra或autoload下
镜像顺序配置错误引发钩子间接失效
当 "packagist.org": false 放在私有源前面,Composer 查完私有源没找到包,立刻碰到这个哨兵就终止,不再尝试其他源 —— 结果是某些钩子依赖的 CLI 工具根本没装上,脚本自然失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这不是钩子机制出问题,而是依赖没拉下来。报错看起来像钩子崩了,实际是 vendor/bin/phpunit 根本不存在。
-
"packagist.org": false必须放在repositories数组末尾,作为“兜底终止符” - 两个私有源都声明支持同一包(如
monolog/monolog),Composer 只取第一个返回非空{"packages":{}}的源,后一个被忽略 - 用
composer install -v观察日志里实际访问了哪些 URL,确认是否真走到了你期望的镜像地址
钩子中调用命令时路径和环境变量失效
镜像不影响路径,但钩子脚本在不同环境下执行时,PATH 和工作目录可能不一致,尤其在 CI 或 Docker 中,vendor/bin/ 不在默认 PATH 里,就会报 sh: php-cs-fixer: not found。
别指望 composer run-script 自动帮你把 vendor/bin 加进 PATH,它默认不继承环境变量。
- 脚本里统一用相对路径调用:
./vendor/bin/php-cs-fixer或全路径:php ./vendor/bin/php-cs-fixer - CI 中显式设置:
export PATH="./vendor/bin:$PATH"再运行脚本 - 避免在
pre-autoload-dump里 new 类 —— 此时vendor/autoload.php还没生成,类肯定找不到
最麻烦的不是镜像或钩子单独出问题,而是两者叠加后错误链变长:镜像漏包 → 工具没装 → 钩子调用失败 → 报错信息模糊 → 你开始怀疑钩子机制本身。其实只要分清「依赖有没有装进来」和「钩子有没有跑起来」这两个独立问题,排查就清晰多了。










