必须启用符号链接并执行composer update acme/utils,禁用classmap权威模式和opcache,windows需管理员权限;否则默认复制或缓存导致修改不生效。

Composer 本地包本身不提供热重载能力,但通过 path 类型仓库 + 符号链接 + 正确的自动加载配置,可以实现「改完即生效」的开发体验——前提是 PHP 进程每次请求都重新解析类文件,而不是固化映射。
为什么改了本地包代码,主项目里没反应
常见错误现象是:你改了 ../my-package/src/Helper.php,但在主项目中调用 new Helper() 仍是旧逻辑。根本原因不是 Composer 没“看见”改动,而是:
- 默认
composer install对path包走的是复制(copy)模式,改源目录 ≠ 改 vendor 目录 - 即使启用了符号链接(symlink),如果用了
composer dump-autoload -o,类路径被写死进vendor/composer/autoload_classmap.php,新类或修改后的方法不会自动识别 - OPcache 或 APCu 缓存了已加载的类定义,PHP 不会重新读取文件
- 某些框架(如 Laravel Octane、Swoole)常驻内存,
autoload.php只在启动时加载一次
必须启用 symlink 并执行 update 才能生效
path 仓库默认不自动创建符号链接;它只在 composer require 或 composer update 时按需生成。且 composer install 不会刷新已有链接的目标路径——哪怕你改了本地包的 Git 分支或文件内容。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在主项目
composer.json的repositories条目中加"options": {"symlink": true} - 确保本地包目录下有合法
composer.json,且name(如"acme/utils")与require中完全一致 - 版本约束必须用
dev-main、dev-develop等分支名,不能写1.0.0 - 执行
composer update acme/utils(不是install或dump-autoload)才会重建 symlink - 验证是否成功:
ls -la vendor/acme/utils应显示-> ../my-package(Linux/macOS);Windows 用户用dir vendor\acme\utils看是否为“快捷方式”类型
autoload 配置必须禁用 classmap 权威模式
热重载依赖 PSR-4 的动态路径查找机制。一旦启用 -o(optimize)或 -a(classmap-authoritative),Composer 就把所有类路径固化成静态数组,后续文件变更完全无效。
- 开发期不要运行
composer dump-autoload -o或composer dump-autoload -a - 确保
vendor/autoload.php加载的$loader实例未开启权威模式:$loader->setClassMapAuthoritative(false) - 如有 APCu 缓存,禁用前缀:
$loader->setApcuPrefix(null) - 若用 OPcache,需配合
opcache_invalidate()或设置opcache.revalidate_freq=0(仅开发环境)
Windows 下 symlink 创建失败且无提示
这是最常被忽略的坑:Windows 默认禁止普通用户创建符号链接,Composer 却静默降级为复制,导致你以为启用了 symlink,实际还是 copy。
- 必须开启「开发者模式」(Settings → Update & Security → For developers)
- 或以管理员权限运行命令行(CMD/PowerShell)再执行
composer update - 验证方式:检查
vendor/acme/utils是否是「快捷方式」类型,而非普通文件夹 - CI/CD 环境无法启用 symlink,上线前务必移除
repositories中的path条目,否则构建失败
真正起作用的不是 Composer,而是 symlink + PSR-4 动态查找 + 无缓存的类加载三者共同作用的结果。任何一环断掉,都会让“改完即生效”变成幻觉。










