Composer不管理分支,仅按约束匹配Git分支或Tag;dev-分支名须与Git实际分支完全一致、区分大小写、含斜杠需保留dev-前缀;require dev-分支须加--stability=dev;commit hash锁入composer.lock,force push会导致失效;生产环境应使用composer install --no-dev --optimize-autoloader。

直接说结论:Composer 不管理分支,它只按你写的约束去匹配 Git 分支或 Tag;多环境依赖一致性靠 composer install + composer.lock + --no-dev 三者配合,不是靠切换配置文件或改 stability。
dev-分支名必须和 Git 实际分支完全一致
很多人写 dev-master 却发现仓库只有 main 分支,结果报错 Could not find a version of package xxx matching your minimum-stability。这不是 Composer 抽风,是它真没找到对应分支。
- Git 有
main分支 → 只能写dev-main,不能写dev-master或dev-main2 - 分支名区分大小写:
dev-Main≠dev-main - 含斜杠的分支(如
feature/login)必须写成dev-feature/login,dev-前缀不能省 - 私有 Git 仓库用 SSH 地址(如
git@gitlab.example.com:acme/utils.git)时,确保运行composer install的机器已配好对应 SSH key
require dev-分支必须加 --stability=dev
默认 minimum-stability 是 stable,而 dev-main 属于不稳定版本,直接 composer require vendor/pkg:dev-main 会失败。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 最安全做法:
composer require vendor/pkg:dev-main --stability=dev - 别永久把
minimum-stability改成dev—— 这会让所有依赖都可能降级到-dev版本,不可控风险陡增 - 如果已设为
dev却仍失败,先检查repositories配置是否漏了 —— 尤其是私有包,没声明源就等于“不存在” -
dev-分支的 commit hash 会被锁进composer.lock,但上游force push会导致下次install失败,因为 hash 对不上
生产环境必须用 composer install --no-dev --optimize-autoloader
漏加 --no-dev 是线上事故高频原因。Laravel/Symfony 项目里,barryvdh/laravel-debugbar 或 symfony/debug 被装上并启用后,轻则拖慢响应,重则暴露堆栈和敏感路径。
-
--no-dev只跳过require-dev里的包安装,不删配置、不影响autoload-dev定义 -
--optimize-autoloader会生成扁平化 classmap,减少 PHP 启动时的文件扫描开销 - CI/CD 脚本、Dockerfile 的
RUN指令里必须写死这个组合,不能依赖环境变量临时覆盖 -
config.platform要锁死 PHP 和扩展版本(如"php": "8.1.0"),写^8.1或~8.1无效
composer.lock 必须提交,且只允许 install 读取
composer.lock 不是缓存,是依赖图的快照。它记录的不只是你直接 require 的包版本,还包括所有嵌套子依赖的具体版本(比如 monolog 依赖的 psr/log 到底是 1.1.4 还是 1.2.0)。
- 不提交
composer.lock→ 每个开发者本地composer install解析出的版本都可能不同 → 「在我机器上能跑」成为常态 - CI 和生产环境必须用
composer install(非update),否则lock文件形同虚设 - 改了
composer.json的require或require-dev,必须运行composer update生成新lock并一起提交 - 只改
autoload或scripts字段则无需更新lock
真正容易被忽略的是:每次切换项目前,必须确认当前目录是目标项目的根目录(含 composer.json),并清理残留的 vendor/ 和旧 composer.lock —— 否则 vendor/autoload.php 会复用上一个项目的 autoload_static.php 快照,导致 Class not found 这类问题根本查不到源头。

















