symlink参数必须显式配置,否则path类型仓库默认复制而非链接;需确保本地包composer.json、主项目repositories及composer.lock三方对齐,且name、url、版本严格匹配,autoload变更后须手动执行composer dump-autoload -o。

symlink参数不配,path仓库默认就是复制
这是最常被误解的一点:很多人以为只要写了 "type": "path",Composer 就会自动软链接。实际不是——symlink 是一个显式开关,不声明就等于关闭。默认行为是把本地包整个复制进 vendor/,改源码完全不影响项目运行结果。
这种设计不是 bug,是 Composer 为保障构建可重现性做的保守选择。它优先确保 composer install 在任何机器上还原出完全一致的 vendor/,而不是方便本地调试。
-
symlink必须写在 本地包自己的composer.json根级(不是主项目),或主项目repositories条目里对应的那个url下 - 两种写法效果等价,但不能只写在主项目里而漏掉本地包——某些旧版本(
- Windows 用户即使配了,也必须以管理员权限运行终端,否则创建失败且无提示,静默 fallback 到 copy
- Docker 场景下,挂载目录需加
--cap-add=SYS_ADMIN,否则 symlink 创建能力被禁用
为什么 composer install 不创建 symlink,非得用 update
composer install 的核心逻辑是“按 composer.lock 还原”,它不重新解析依赖来源类型,也不检查 repositories 配置是否支持 symlink。哪怕你刚改完 composer.json 加了 "options": {"symlink": true},install 也不会触发链接重建。
只有 composer update(或带包名的 composer update vendor/name)才会重走完整流程:发现仓库 → 解析 source.type → 检查 symlink 权限 → 创建符号链接。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 首次启用 symlink:必须执行
composer update vendor/name,不能用install - 后续修改本地包代码:不需要再
update,符号链接已存在,改源码即刻生效 - 如果之前
install过,vendor/vendor/name已是普通文件夹,得先手动删掉再update,否则 Composer 会跳过 symlink 步骤 - 验证是否成功:Linux/macOS 运行
ls -la vendor/vendor/name,看到->才算真链接;Windows 用dir vendorendor ame看是否为“JUNCTION”或“快捷方式”
路径、包名、版本三者错一个,symlink 就不会生效
Composer 对 path 类型仓库的匹配极其严格,90% 的 “Could not find package” 错误都源于这三处之一不匹配。它不会模糊查找,也不会报明确错误,而是直接忽略你的 repositories 配置,转头去 Packagist 搜。
-
name字段必须大小写、分隔符(仅短横线-)、vendor 名全部一致,"acme/utils"≠"Acme/utils"≠"acme_utils" -
url必须指向含合法composer.json的目录,且是相对于主项目composer.json的路径,末尾不能加/("../my-pkg/"会被静默忽略) - 版本约束必须用分支名,如
"dev-main"或"dev-develop";写"1.0.0"会导致 Composer 忽略 path 仓库,去远程找稳定版 - 本地包
composer.json必须语法合法(无尾逗号、全双引号、JSON 格式正确),否则整个仓库被跳过
改了 autoload 映射,symlink 生效了也没用
符号链接只是让文件路径打通,但类能否被 new 或 use,取决于自动加载器是否知道新路径。如果你在本地包里新增了 PSR-4 命名空间,或者改了 "psr-4": {"Acme": "src/"} 中的路径,主项目不会自动感知。
composer dump-autoload 不刷新 symlink,但它会重生成类映射表。这个命令必须手动执行,且推荐加 -o 优化选项。
- 改本地包
composer.json的autoload段后,必须运行composer dump-autoload -o - IDE 调试时(如 PHPStorm/Xdebug),断点路径需与磁盘真实路径一致;若 symlink 目标路径含中文或空格,某些 PHP 版本可能解析失败
- 验证 autoload 是否生效:临时在主项目里
var_dump(class_exists('Acme\Helper')),返回false就说明映射没更新
composer.json 有 options、主项目 repositories 匹配成功、composer.lock 里该包的 "source": {"type": "path"} 存在。少一个环节,你看到的就只是个安静的复制文件夹。










