直接写"dev-main"或"dev-master"无效,必须同时满足:minimum-stability允许dev级别、分支真实存在、已声明vcs仓库、执行composer update --refresh刷新元数据缓存,并确保composer.lock更新到最新commit。

dev分支在composer.json里怎么写才有效
直接写 dev-main 或 dev-master 是无效的,除非你同时满足两个前提:当前 minimum-stability 允许 dev 级别,且该分支真实存在并被 Composer 元数据识别到。
常见错误是只改了分支名,但没调 composer update --refresh,导致 Composer 还在用 15 分钟前缓存的 packages.json,压根不知道远程有新 commit。
-
"minimum-stability": "dev"会全局放宽,不推荐;更安全的是临时加--stability=dev - 分支名含斜杠(如
dev-feature/login)必须用引号包裹:composer require vendor/pkg:"dev-feature/login" - 私有 GitHub 仓库必须先在
repositories里声明vcs类型,否则composer require根本查不到这个包
composer install 为什么永远装不到 dev 分支最新提交
composer install 完全不查远程——它只按 composer.lock 里记录的 commit hash 去找 ZIP 包。哪怕你刚 push 了新代码,只要 lock 文件没更新,它就当不存在。
这就是为什么 GitHub 上能看到 dev-main 的最新 commit,但 vendor/ 里还是旧版本。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer clear-cache只清 ZIP 缓存,对元数据无效 - 必须先执行
composer update --refresh(≥2.5)或手动删cache-dir/repo/https---...下的 provider 文件 - 刷新完再跑
composer require vendor/pkg:dev-main,才能让 lock 文件记录新 hash
dev 分支依赖更新后 autoload 仍加载旧类怎么办
即使 vendor/ 里已是新 commit,如果项目代码里用了 class_exists('SomeTestHelper') 这类运行时判断,而 autoload-dev 又声明了测试路径,PHP autoloader 可能 fallback 到已删除的旧文件,报 warning 或 fatal error。
这不是 Composer 的 bug,而是 PSR-4 自动发现机制的副作用。
- 生产环境部署务必加
--classmap-authoritative,强制只走 classmap,跳过自动扫描 - 构建阶段用
composer dump-autoload --optimize --classmap-authoritative生成确定性映射 - 检查
composer.json的autoload-dev是否残留了已废弃的路径
私有仓库 dev 分支无法 require 的典型卡点
不是权限问题,也不是 token 没配——最常被忽略的是:新 repositories 配置不会被已缓存的元数据读取,composer update --refresh 必须在 composer require 之前执行。
另一个隐性条件:该仓库的 dev-main 分支必须有至少一个 commit,且不能是空分支(GitHub 不暴露空分支的元数据)。
- VCS 源配置要放在
repositories数组首位,避免被 Packagist 默认源覆盖 - 私有库若用 HTTPS,token 必须带
read:packages权限;用 SSH 则需确保ssh-agent已加载对应 key - 执行
composer show vendor/pkg能看到分支列表,才是元数据真正生效的标志
composer.json 就能立刻 require,结果反复失败。dev 分支的本质不是“动态分支”,而是“静态 commit 快照”,所有动作都得围绕这个前提设计。










