Composer install不创建软链接,因它仅按composer.lock还原状态,不处理symlink逻辑;仅composer update在满足symlink配置、权限及版本要求时才尝试创建。

composer install 为什么对 path 包不创建软链接
因为 composer install 完全不处理软链接逻辑,它只按 composer.lock 还原已记录的安装状态。哪怕 lock 文件里写的是 "source": {"type": "path"},只要 vendor 下没链接(比如首次运行或被删过),install 也不会重建——它连判断都不做,直接 fallback 到复制模式。
真正触发 symlink 创建的唯一命令是 composer update,且必须满足:本地包 composer.json 根级含 "options": {"symlink": true}、PHP 进程有权限、Composer ≥ 2.2。
- Windows 用户必须以管理员身份运行终端,否则
symlink静默失败,vendor 里出现普通文件夹 - Docker 容器需加
--cap-add=SYS_ADMIN,且挂载目录支持符号链接 - 执行
composer update vendor/name比全量update更安全,避免误刷其他依赖版本
软链接生效后,改本地代码为何有时不生效
不是链接失效,而是自动加载器没更新。Composer 创建了 vendor/vendor/name -> /path/to/local,但 PSR-4 映射仍来自旧的 vendor/composer/autoload_psr4.php,尤其当你在本地包中新增类、改命名空间或调整 autoload 配置时。
必须手动运行 composer dump-autoload -o,否则 new LocalClass() 会报 Class not found。
- 这个动作不改变 vendor 结构,只刷新自动加载映射
- 如果本地包用了
classmap或files,也要确保对应路径在新映射中被包含 - IDE(如 PHPStorm)可能缓存旧路径,需同步刷新索引或检查 “Include paths” 是否指向真实磁盘路径
如何确认当前用的是 path 源而非远程包
别只看 vendor 目录有没有箭头,要交叉验证三处:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 运行
composer show vendor/name,输出中source行应为type : path,不是git或package - 打开
composer.lock,搜索该包名,确认其"source": {"type": "path", "url": "..."}字段存在且非空 - 执行
ls -la vendor/vendor/name(Linux/macOS)或dir vendor\vendor\name(Windows),看到->或JUNCTION才算 symlink 成功
三者缺一不可。常见陷阱是 lock 文件里是 path,但 vendor 是普通文件夹——说明 update 时 symlink 创建失败,已 fallback 到 copy。
本地包 name 或路径不匹配的典型表现
Could not find package vendor/name 却在 composer show --all 里完全看不到它,基本可断定是 name 或路径错配。
Composer 对这两项严格字面匹配:大小写、分隔符(只认短横线 -,不认下划线 _ 或驼峰)、路径末尾不能带 /,且 url 必须指向含 composer.json 的目录,不是其父级。
- 路径写成
"../my-pkg/"(末尾斜杠)→ 静默忽略整个仓库 - 本地包
composer.json中"name": "MyOrg/utils"→ 要求require写"MyOrg/utils",写"myorg/utils"就失败 - Windows 下路径含中文或空格 → 某些 PHP 版本解析
is_dir()失败,无错误提示,只跳过
最省事的自查方式:把本地包目录绝对路径粘贴进终端,执行 php -r "var_dump(is_dir('PATH'));",返回 bool(true) 才算路径可访问。

















