必须在主项目composer.json顶层配置repositories.path,url用相对路径,type设为"path",本地包name与require严格一致,启用symlink并执行composer update vendor/name,修改autoload后需手动dump-autoload。

直接用 composer update vendor/name,不是 install,也不是 require —— 后两者在本地包场景下大概率静默失败或绕过 path 源。
主项目 composer.json 必须加 repositories.path
缺了这一步,Composer 根本不会看你的本地目录,而是直连 Packagist 并报 Could not find package。
-
repositories字段必须放在主项目根目录的composer.json顶层,不能嵌套在require或其他字段里 -
url值必须是相对路径(如"../my-pkg"),绝对路径("C:/work/my-pkg")和~、$HOME等变量写法全部无效 -
type必须明确写成"path",写成"package"、"vcs"或漏掉,都会导致失效 - 别把
repositories错加到本地包自己的composer.json里——它对主项目毫无作用
本地包 composer.json 的 name 必须和 require 完全一致
这是 90% 失败的根源。大小写、vendor 名、分隔符(/ vs -)、空格,一个字符都不能差。
- 主项目
require写的是"acme/utils": "dev-main",那本地包的name就只能是"acme/utils",不能是"Acme/utils"、"acme-utils"或"acme/utils-dev" - 如果本地包还没初始化 Git,建议在它的
composer.json里显式加"version": "dev-main",否则 Composer 可能无法识别分支名 - 避免在
require中使用"*"或"@dev"这类模糊约束——它们会让 Composer 绕过path源,降级去 Packagist 查找
启用 symlink 才能实时响应代码修改
默认模式是复制(copy),改本地包代码不会同步到 vendor/ 下。要热更新,必须开启符号链接。
- 在主项目
composer.json的对应repositories条目里加:"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端,或提前开启“开发者模式”,否则
symlink会静默 fallback 到 copy - 首次引入必须执行
composer update vendor/name(带包名),因为install只读composer.lock,不重新解析仓库类型 - 验证是否成功:
ls -la vendor/vendor/name(macOS/Linux)应看到->指向源目录;Windows 上dir vendor\vendor\name应显示“快捷方式”类型
autoload 修改后必须手动 dump-autoload
哪怕 symlink 已建好,只要改了本地包的 autoload 映射(比如新增 PSR-4 命名空间、调整路径、加 autoload-dev),vendor/autoload.php 就不会自动识别新类。
- 进主项目根目录,执行:
composer dump-autoload -o - 如果只改了测试相关 autoload,记得加
--dev参数:composer dump-autoload --dev -o - 别依赖 IDE 自动刷新或重启 Web Server —— autoload 是 PHP 层级的映射,必须由 Composer 重建
最易被忽略的一点:所有路径、name、分支名、autoload 映射,都是逐字匹配的字符串比较,没有容错、不忽略大小写、不自动标准化分隔符。出问题时,第一反应不该是查网络或权限,而是打开三个文件逐字符比对:主项目 composer.json → require、主项目 composer.json → repositories.url、本地包 composer.json → name。


















