composer默认过滤dev-main等不稳定版本,因minimum-stability默认为stable,必须显式加@dev后缀(如dev-main@dev)或配置vcs源才能安装。

不能直接装 dev-main 或 @beta,不是命令写错,是 Composer 默认把它们当“不存在”过滤掉了。
为什么 composer require vendor/name:dev-main 总报 “Could not find package”
Composer 在解析版本前就做了硬过滤:只要 minimum-stability 是 stable(默认值),所有带 dev-、@alpha、@beta 的版本都会被跳过,连远程请求都不发。
- 必须显式声明稳定性意图,最直接的是加
@dev后缀:composer require vendor/name:dev-main@dev - 只写
dev-main不够,dev-main@dev才是完整合法标识 - 如果包本身没打
v2.0.0-beta1tag,只打了2.0.0-beta1(缺v前缀),那"vendor/name": "2.0.0-beta1"才能匹配,"^2.0@beta"会失败 - 执行后立刻运行
composer show vendor/name,确认输出的versions行里真有dev-main或对应 beta tag
minimum-stability 和 prefer-stable 到底怎么配才不翻车
minimum-stability 是闸门,prefer-stable 是排序器——它俩不互换,也不抵消。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"minimum-stability": "stable":所有dev-、alpha、beta全部被拦在门外,prefer-stable根本没机会生效 -
"minimum-stability": "dev", "prefer-stable": true:闸门开了,但优先选 stable;如果你require里明确写了dev-main,它照装不误 - 别设
"minimum-stability": "dev"却漏掉prefer-stable:CI 构建时可能随机拉到不同 commit,导致不可重现 -
prefer-stable必须写在composer.json根层级,写在config对象里完全无效
私有仓库或 GitHub 上未发布的包为啥死活装不上
Composer 查不到 dev-main,往往不是权限问题,而是它压根不知道该去哪找这个包。
- 必须先在
composer.json的repositories段注册 VCS 源:"repositories": [ { "type": "vcs", "url": "https://github.com/vendor/name" } ] -
url必须是可git clone的地址(https://...或git@...),不能是网页链接 - SSH 地址(
git@...)需提前配置好 SSH key,否则卡在 clone 阶段 - 注册后仍装失败?加
-v参数跑composer require,看输出里有没有no dist defined或could not determine version提示
composer.lock 是最大隐形障碍
改完 composer.json,composer install 还是旧版本?大概率是 lock 文件在“替你做主”。
-
lock文件优先级高于composer.json,它锁的是具体 commit hash(如"reference": "a1b2c3d"),不是分支名 - 想让新配置生效,必须运行
composer update vendor/name,而不是install - 如果之前锁过稳定版,
require可能不触发重算——删掉lock里该包条目,或干脆删整个composer.lock再试 - CI 环境中若缓存了
vendor/或composer.lock,要显式加--no-cache或composer update --no-interaction
真正难处理的从来不是怎么装上,而是装上之后:dev 分支没语义锚点,下次 update 可能拉到完全不同的代码;alpha 包的 API 可能在小版本间破坏性变更;而 lock 文件里的 commit hash,没人会主动去核对它是否还对应你想要的那个“最新测试版”。










