根本原因是Composer对path类型仓库不解析语义化版本约束,仅依赖本地composer.json的name和version字段;需正确定义repositories为type:"path"、url为相对路径,修改version后须执行composer update --with-dependencies或清理锁文件。

本地包的版本号报错,根本原因不是写错了,而是 Composer 根本没按你写的约束去解析——它只认 repositories 里注册为 path 类型后、再通过 "*" 拉取的本地 composer.json 中的 version 字段。
为什么写 "my-vendor/pkg": "^1.2.0 会报错或被忽略
Composer 对 path 类型仓库不做语义化版本解析。你写任何 ^、~、=、@stable 都无效,还会触发警告(比如 Skipped tag v1.2.0, no composer.json found),因为它压根不查 Git tag 或远程元数据。
- 报错常见现象:
Your requirements could not be resolved to an installable set of packages,但实际是“约束被静默跳过”,不是真冲突 - 真正起作用的只有本地包目录下
composer.json的name和version字段,且name必须和主项目require中完全一致 - 如果你写了
"my-vendor/pkg": "1.2.3",Composer 会尝试去 Packagist 找这个版本,而不是读本地 —— 因为没声明type: "path",它根本不认为这是本地包
repositories 配置错一个字符就失效
url 必须是相对于项目根目录的路径,不能带 file://,不能是 URL 或 git 地址;type 必须小写 "path",不是 "package" 或 "vcs"。
- 错误示例:
"url": "packages/my-local-package"(少./,Windows 下可能被当盘符解析) - 错误示例:
"type": "Path"(首字母大写,Composer 不识别) - 错误示例:
"url": "../shared-packages/pkg"(路径越界,Composer 会报Directory does not exist) - 验证方式:运行
composer config repositories,确认输出中type是path、url是绝对路径(如/full/path/to/project/packages/pkg)
本地包 version 字段改了却不生效?检查这三个地方
Composer 在安装时读一次本地包的 version,之后就缓存进 composer.lock,不会自动监听文件变更。改了 composer.json 里的 version 后,必须显式触发重解析。
- 执行
composer update my-vendor/pkg --with-dependencies(注意加--with-dependencies,否则子依赖不会同步更新) - 如果锁文件里还记着旧版本,直接删掉
"my-vendor/pkg"条目再跑composer update更可靠 - 别用
composer dump-autoload—— 它只刷新自动加载映射,跟版本无关 - 极端情况:运行
composer clear-cache再重试,某些旧版本 Composer 会对path仓库做路径级缓存
最易被忽略的一点:本地包的 version 字段一旦写成 "dev-main" 或 "1.2.x-dev",它就变成不稳定版本,会受项目级 "minimum-stability" 约束影响——哪怕你主项目设了 "prefer-stable": true,也得显式允许 dev 才能装进去。











