必须设置"minimum-stability": "dev",否则Composer默认过滤dev版本导致本地包无法识别;还需配"prefer-stable": true,并运行composer update --lock生效,require中须显式写"dev-main"或"@dev",且启用"preferred-install": {"*": "source"}以生成符号链接。

不加 minimum-stability,本地包基本无法被识别——它不是可选项,是 path 仓库能工作的前提条件。
为什么 composer require mypackage/dev-main 总报 “Could not find package”
常见错误现象:明明 repositories 配好了 type: "path",composer.json 里也写了 "mycompany/utils": "dev-main",执行 composer require 却提示找不到包。
根本原因不是路径错、名字错,而是 Composer 默认只接受 stable 版本,而 dev-main 属于 dev 级别,直接被过滤掉。
- 必须在项目根目录
composer.json的顶层(和require同级)加字段:"minimum-stability": "dev" - 同时强烈建议配
"prefer-stable": true,否则所有依赖都可能被降级到dev分支,破坏稳定性 - 改完必须运行
composer update --lock,否则composer.lock不刷新,新设置不生效 - 注意大小写:
RC必须全大写,rc或Rc会被忽略,退回到默认stable
require 里版本号怎么写才有效
即使 minimum-stability 设成了 dev,require 里的版本写法仍决定能否命中本地包。
- 不能写
"mycompany/utils": "*"或省略版本——Composer 会去 Packagist 查找,而不是走你配的path仓库 - 必须显式指定开发分支名,如
"mycompany/utils": "dev-main"(前提是本地包 Git 在main分支,且已 commit) - 也可以用
"mycompany/utils": "@dev",但前提是项目已设minimum-stability: "dev";单独写@dev不生效 - 如果本地包没初始化 Git,可在它的
composer.json里临时加"version": "dev-main",绕过分支检测
本地修改不生效?大概率是没启用 symlink
配置好 repositories 和 minimum-stability 后,composer install 仍拉远程包、改了 vendor/ 下的代码下次就被覆盖——这不是缓存问题,是设计如此。
- Composer 默认把包当作“下载物”,
composer.lock锁定哈希值,每次安装都按锁文件还原 - 要让本地代码实时生效,必须让
vendor/mycompany/utils变成指向本地目录的符号链接 - 方法:在项目
composer.json的config段加"preferred-install": {"*": "source"},或全局执行composer config --global preferred-install.source true - 然后删掉
vendor和composer.lock,重新composer install,就能看到vendor/下是 symlink 而非复制文件
最容易被忽略的是:改完 minimum-stability 不运行 composer update --lock,等于没改;而没启用 source 安装模式,本地调试就只是“假装在调试”。











