必须在主项目composer.json的repositories中为该包显式配置"options": {"symlink": true},并确保系统权限允许创建符号链接、composer版本≥2.2,且验证vendor目录下存在指向本地路径的符号链接。

怎么让 Composer 对某个包强制用 symlink 而不是 copy?
默认情况下,Composer 在 path 仓库满足条件时会尝试创建符号链接,但一旦失败(比如 Windows 非管理员、Docker 容器无权限、或文件系统不支持),它会静默 fallback 到复制模式——你改了本地代码,项目里完全没反应。
必须显式启用 symlink 并确认环境支持:
-
"options": {"symlink": true}要加在repositories的对应条目里,不能只写"type": "path" - Linux/macOS 下确保目标路径可写、且未被挂载为 noexec 或 nosuid
- Windows 下需以管理员身份运行
composer install,否则mklink /D会失败 - 检查结果:运行
ls -la vendor/vendor/name(macOS/Linux)或dir vendor\vendor\name(Windows),看到<symlinkd></symlinkd>或箭头->才算成功
为什么 composer require vendor/name:dev-main 没链接到本地?
因为 Composer 默认只从 Packagist 或你配置的远程源拉取 dev-main,根本不会扫描你的硬盘——除非你提前告诉它“这个包可以从本地找”。
关键动作不是改 require,而是先声明仓库:
- 在项目根目录
composer.json的repositories数组开头加一条:{"type":"path","url":"../my-package","options":{"symlink":true}} -
url必须是相对路径(推荐)或绝对路径,且指向一个含composer.json的目录 - 该
composer.json里"name"字段必须和require中的包名**逐字符一致**,包括大小写和斜杠 - 执行
composer require vendor/name:dev-main --no-update再composer update vendor/name,避免全量更新干扰
本地包 composer.json 里哪些字段不能少?
缺任何一项都可能导致 Could not find package 或链接后类自动加载失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
最小必要字段:
-
"name":必须与require完全一致,例如"acme/utils" -
"autoload":至少包含"psr-4"映射,路径要和实际 src 目录匹配,否则composer dump-autoload也救不了 -
"version"字段建议显式写成"dev-main"(如果主分支叫 main),否则 Composer 可能推断出错 - 不需要
"type": "library"或"license",但缺"autoload"就等于没入口
开发中改了本地包,为什么项目里还是旧逻辑?
大概率不是 Composer 没链接,而是 PHP 自动加载缓存没刷新,或者 symlink 被破坏后 Composer 没重装。
排查顺序:
- 先运行
composer show vendor/name,看source是path还是dist;如果是dist,说明链接根本没生效 - 删掉
vendor/vendor/name,再跑composer update vendor/name --no-cache - 改完本地包后,只需在主项目里执行
composer dump-autoload(不用--optimize),尤其当你调整了命名空间或文件路径 - 如果用了
opcache,记得重启 PHP-FPM 或 CLI 进程,否则即使文件变了,opcode 还在缓存里
最常被忽略的是 autoload 配置和 opcache —— symlink 成功了,但类根本没被加载进来,这种问题比链接失败更难定位。










