改本地包代码主项目仍用旧逻辑,是因为Composer未刷新符号链接且自动加载映射未更新;需执行composer update vendor/name和composer dump-autoload -o,并确保path仓库配置正确、权限充足、路径无误。

为什么改了本地包代码,主项目里还是旧逻辑
根本不是 Composer 没“看到”改动,而是它默认没重建链接。path 类型仓库在首次 composer require 或 composer update vendor/name 时创建符号链接(symlink),之后 composer install 完全不碰这个链接——哪怕你改了本地 src/Helper.php,vendor/vendor/name/Helper.php 仍是原软链指向的旧文件内容。
验证是否真用了 symlink:ls -la vendor/vendor/name(Linux/macOS)或 dir vendor\vendor\name(Windows),输出含 -> 或 JUNCTION 才算成功;若显示普通文件夹,说明 fallback 成了 copy,后续所有修改都无效。
- 必须执行
composer update vendor/name(不能只用install)才能刷新 symlink 目标 - Windows 下需管理员权限运行终端,否则 symlink 创建失败且无提示
- Docker 中需加
--cap-add=SYS_ADMIN,且挂载方式要支持 symlink - 本地包自己的
composer.json必须含"options": {"symlink": true},缺这句,即使主项目配了也常 fallback
本地包 composer.json 配置错一个字符就失效
name 字段必须和 require 中写的逐字一致:大小写、分隔符(只能是短横线 -,不能是下划线 _ 或驼峰)、vendor 名全部对齐。例如 "acme/utils" ≠ "Acme/utils" ≠ "acme_utils"。Composer 不模糊匹配,错一个字符就查不到包,composer show --all 里根本不会出现该包名。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
url必须指向含composer.json的目录,不是文件本身,也不能以/结尾("../my-pkg/"会被静默忽略) - 路径是相对于主项目
composer.json的位置,不是 shell 当前工作目录 - 本地包根目录下必须有合法
composer.json:无尾逗号、全双引号、JSON 语法有效 - Windows 用户避免路径含中文或空格,某些 PHP 版本解析会直接崩溃
autoload 映射没更新,类能加载但 new 失败
path 仓库让包“存在”,但能否 new Helper() 或 use Acme\Helper,取决于 autoload 映射是否包含本地源码的真实路径。即使本地包 composer.json 写了 "psr-4": {"Acme": "src/"},主项目也不会自动把 ../my-pkg/src/ 加进自动加载路径。
- 必须手动执行
composer dump-autoload -o(加-o是关键,否则 PSR-4 映射可能不生效) - 如果本地包用了自定义命名空间前缀,确保主项目
autoload或autoload-dev没覆盖或冲突 - Xdebug 断点不命中?检查 IDE 中设置的路径是否和磁盘真实路径完全一致(如
C:\projects\my-pkg≠C:/projects/my-pkg)
CI/CD 或 Docker 构建时 symlink 失败还报错
path 类型仓库本质是本地文件系统操作,在 CI 环境或容器里几乎必然失败:构建机没有 ../my-pkg 目录,Docker 容器未挂载对应路径,或权限不足无法创建 symlink。此时 Composer 会 fallback 到 copy,但你根本不知道——直到上线后发现代码没更新。
- 上线前必须从主项目
composer.json的repositories中删掉整个 path 条目 - CI 脚本中应加检查:
grep -q '"type":"path"' composer.json && (echo "ERROR: path repo found in prod"; exit 1) - 真正适合部署的方案是:用
package类型 + zip 归档,或走私有 Packagist 镜像(如 Satis)
最隐蔽的坑不在配置,而在“以为改了就能生效”的直觉——path 仓库的 symlink 和 autoload 是两套独立机制,缺一不可;而它们各自生效的前提,又都卡在几个极易被忽略的字符和权限上。

















