根本原因是composer install只创建缺失的符号链接,不刷新已存在的链接目标;必须运行composer update my-vendor/my-package才能重建symlink并更新autoload映射。

composer install 为什么改了本地包代码却不生效
因为 composer install 只创建缺失的符号链接,不刷新已存在的链接目标。它完全依赖 composer.lock 中固化的结果——这个结果是在上次 composer update 或 composer require 时确定的。改完 ../packages/my-package 里的 PHP 文件,vendor/my-vendor/my-package 仍是原来指向旧状态的 symlink,内容不会自动更新。
常见错误现象:Class not found 或调用新方法报 Call to undefined method,但 ls -la vendor/my-vendor/my-package 显示链接存在、路径也对。
- 必须运行
composer update my-vendor/my-package才会重新解析repositories中的path配置,重建 symlink - 不要用无参数的
composer update,它会重算整个依赖树,可能意外升级其他包 - 如果本地包没提交 git tag,确保其
composer.json里有明确"version": "dev-main"(或对应分支名),否则require的版本约束可能无法匹配
符号链接没创建成功?检查这三处硬性条件
Linux/macOS 下 vendor/ 出现的是真实文件而非 symlink,说明链接创建失败。这不是 Composer 报错,而是静默 fallback 到复制行为——通常因为不满足 symlink 前提。
- 操作系统支持:Windows 需开启“开发者模式”或以管理员权限运行终端;Docker 容器默认禁用 symlink,需加
--cap-add=SYS_ADMIN或改用bind mount -
repositories中url必须是目录路径(如"../packages/my-package"),不能是../packages/my-package/composer.json - 该目录下必须存在合法
composer.json,且其中"name"字段与require中写的**完全一致**(包括大小写和 vendor 名)
CI/CD 或生产环境千万别留 path 仓库配置
CI 构建机、Docker 构建上下文、生产服务器上根本不存在你本地的 ../packages/ 路径,composer install 会直接失败并报 Could not find a matching version of package my-vendor/my-package。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确做法是:在 composer.json 提交前,删掉 repositories 数组中所有 "type": "path" 条目;改用 "type": "vcs" 指向 Git 仓库,或上线前用 composer config --unset repositories 清理。
- Git 提交前执行
git diff composer.json,确认没有残留path配置 - CI 脚本开头加检查:
grep -q '\"type\": *\"path\"' composer.json && (echo "ERROR: path repo found in CI"; exit 1) - 如果真需要内网共享包,必须用 Satis 构建静态镜像,
path协议只适用于单机开发
想改代码立刻生效,但又不想每次跑 update
最轻量的方式是手动维护 symlink:改完本地包后,在项目根目录执行 rm -rf vendor/my-vendor/my-package && ln -s $(pwd)/../packages/my-package vendor/my-vendor/my-package(Linux/macOS);Windows 可用 mklink /D。
但这绕过了 Composer 的版本校验和 autoload 生成逻辑,仅适合快速验证。长期协作中仍推荐走 composer update my-vendor/my-package 流程——它同时刷新 vendor/autoload.php 的类映射(如果用了 PSR-4),而手动 symlink 不触发这个动作。
容易被忽略的一点:composer dump-autoload 和 symlink 无关,它只重写类加载映射;改了本地包的命名空间或目录结构,必须先 update 再 dump-autoload,否则 Class not found 依然会出现。










