path仓库autoload失效的根源是映射未更新,需手动执行composer dump-autoload -o;symlink失败会导致修改无效,应验证链接状态并确保配置正确;开发期禁用optimize-autoloader以避免PSR-4失效。

path 仓库的 autoload 没生效,不是 Composer 没加载,是映射没更新
本地 path 仓库 require 成功,vendor/ 里也解出来了,但 new LocalPackageSomeClass() 报错 Class not found——这通常不是 Composer 没识别到包,而是它的自动加载规则压根没包含你改过的源码路径。
关键点在于:autoload 映射只在 composer dump-autoload 时生成,而 path 仓库本身不会触发这个动作。即使你改了本地包的 composer.json 里的 psr-4 配置,主项目也不会自动重扫。
- 每次改完本地包的类结构或
autoload配置,必须手动运行composer dump-autoload -o(加-o确保 classmap 生效) - 如果本地包用了
classmap,还要确认它的composer.json中"classmap": ["src/"]路径正确,且不含tests/或docs/这类无用目录 - 开发中别依赖
"optimize-autoloader": true,它会让 PSR-4 失效,只走 classmap——而 path 包的 classmap 往往没及时更新,反而更难调试
symlink 没建成功,你以为在改源码,其实还在跑副本
path 类型仓库默认尝试创建符号链接,失败就静默 fallback 到复制(copy)。结果是你在本地包里改了代码,vendor/vendor/name 里还是旧文件,根本没生效。
验证是否真用了 symlink:
- Linux/macOS:运行
ls -la vendor/vendor/name,看到箭头→才是 symlink - Windows:运行
dir vendorendor ame,看到JUNCTION或SYMLINKD才对 - 若显示为普通文件夹,说明 fallback 成 copy —— 此时立刻检查本地包自己的
composer.json是否有"options": {"symlink": true}
常见失败原因:
- Windows 下没以管理员身份运行终端
- Docker 容器没加
--cap-add=SYS_ADMIN,或挂载方式不支持 symlink - 本地包路径含中文、空格或末尾多了
/(如"url": "../my-pkg/")
autoload_classmap.php 越大越慢,开发期别让它膨胀
autoload_classmap.php 是全量映射数组,开发时频繁增删类,它会越攒越大。每次请求都要反序列化几 MB 数据,OPcache 也救不了——尤其当你开了 Xdebug,反序列化开销直接翻倍。
- 开发中禁用
--optimize-autoloader,让 Composer 走 PSR-4 + 文件系统查找,虽然单次略慢,但热更新零延迟 - 删掉本地包
composer.json中无意义的classmap条目,比如"tests/"、"examples/" - PSR-4 前缀别写太宽,例如
"MyLib\": "src/"比"MyLib\": "./"更安全,避免意外匹配到临时文件 - 如果必须动态加载(比如插件机制),改用
require_once显式引入,别靠 autoload 抗压
COMPOSER_COMMAND 不是用来跳过脚本的,是帮你区分 install 和 update 的
你在本地 composer install 后,post-install-cmd 里又跑了 npm run build 或 php artisan config:cache?这不是 bug,是 Composer 的设计行为:install 和 update 都会触发该钩子,哪怕 composer.lock 没变。
真正要解决的是“不该跑的时候别跑”,而不是关掉整个钩子:
- PHP 脚本里用
getenv('COMPOSER_COMMAND') === 'update'判断,只在 update 时执行耗时操作 - Shell 脚本里用
[ "$COMPOSER_COMMAND" = "update" ],注意别和COMPOSER_DEV_MODE混淆 - 别把同一逻辑重复注册到
post-install-cmd和post-update-cmd,否则 update 会执行两遍 - CI 流水线里建议固定用
composer install --no-scripts,把构建步骤拆到单独 stage,更可控
最常被忽略的一点:path 仓库的调试效率,不取决于 Composer 本身多快,而取决于你有没有切断“修改 → 重装 → 重扫 → 重启服务”这个链路。symlink 和 autoload 映射的同步,才是本地迭代速度的瓶颈所在。


















