composer self-update --preview 只升级到当前主版本线下的最新预发布版,如 v2.5.12 → v2.6.0-RC1,不跨大版本;预览版仅限官方 RC/Beta,非每日快照。

composer self-update --preview 能装到什么版本?composer self-update --preview 只会升级到当前主版本线下的最新预发布版,比如你用的是 v2.5.12,它最多升到 v2.6.0-RC1,绝不会跳到 v3.0.0-alpha——截至 2026 年 3 月,v3 尚未开放预览通道,强行指定会报错。
这不是网络慢或配置错,而是 Composer 内置的版本策略限制。
- 预览版只来自官方发布的 RC / Beta,不是每日快照(那得用
--snapshot)
- 国内直连
getcomposer.org 常超时,可临时换镜像:export COMPOSER_HOME=~/.composer && composer self-update --preview -vvv,再配合 curl -L <a href="https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9">https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9</a> 手动下载替换
- 装完务必运行
composer --version 确认输出含 -RC 或 -beta,否则可能还是旧稳定版
怎么用 composer require 安装 dev 分支?
直接写 composer require vendor/name:dev-main 就行,不需要改 composer.json 或提前加 repositories——前提是这个包在 Packagist 上已索引,且远程仓库存在 main 分支。
- 分支名必须加
dev- 前缀,composer require vendor/name:main 会被当成版本号去 Packagist 查,大概率报 Could not find package
- 含斜杠的分支(如
feature/login)必须写成 dev-feature/login,大小写也必须完全一致(Git 分支名区分大小写)
- 如果目标分支不在官方源里(比如你 fork 后改了代码),就得手动加
repositories:
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/yourname/package" }
],
"require": {
"vendor/package": "dev-fix-redis-timeout"
}
}
为什么有时明明写了 dev-main 还是装不上?
最常见原因是稳定性约束没过。Composer 默认只允许装 stable 版本,遇到 dev-main 会直接跳过,报错类似 Could not find package ... at version dev-main。
- 解决办法有三种:加
@dev 后缀(composer require vendor/name:dev-main@dev)、根项目设 "minimum-stability": "dev"、或临时加 --stability=dev 参数
- 注意
prefer-stable: true 不影响安装,它只是“在满足 minimum-stability 前提下优先选 stable”,不解决找不到 dev 分支的问题
- 运行
composer show -a vendor/name 能看到所有可用分支和标签,如果列表里没有 dev-main,说明该分支要么没推送到远程,要么没被 Packagist 抓取
装了预览版或 dev 分支后,怎么安全回退?
预览版出问题,composer self-update --stable 一行就切回最新稳定版;dev 分支装错了,composer require vendor/name:2.5.0(或任意稳定版号)就能覆盖掉。
- 不建议靠删
vendor 和 composer.lock 回退,依赖关系可能被破坏
-
composer update vendor/name 不会自动切回 stable,它只按当前 composer.json 中写的约束更新,所以改完版本号后一定要显式执行
- 私有仓库或 fork 的包,回退时别忘了同步清理
repositories 配置,否则下次 update 还可能拉错源
--snapshot) getcomposer.org 常超时,可临时换镜像:export COMPOSER_HOME=~/.composer && composer self-update --preview -vvv,再配合 curl -L <a href="https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9">https://www.php.cn/link/1569ae888190eb8c53b218b0d529e1e9</a> 手动下载替换 composer --version 确认输出含 -RC 或 -beta,否则可能还是旧稳定版 composer require vendor/name:dev-main 就行,不需要改 composer.json 或提前加 repositories——前提是这个包在 Packagist 上已索引,且远程仓库存在 main 分支。
- 分支名必须加
dev-前缀,composer require vendor/name:main会被当成版本号去 Packagist 查,大概率报Could not find package - 含斜杠的分支(如
feature/login)必须写成dev-feature/login,大小写也必须完全一致(Git 分支名区分大小写) - 如果目标分支不在官方源里(比如你 fork 后改了代码),就得手动加
repositories:{ "repositories": [ { "type": "vcs", "url": "https://github.com/yourname/package" } ], "require": { "vendor/package": "dev-fix-redis-timeout" } }
为什么有时明明写了 dev-main 还是装不上?
最常见原因是稳定性约束没过。Composer 默认只允许装 stable 版本,遇到 dev-main 会直接跳过,报错类似 Could not find package ... at version dev-main。
- 解决办法有三种:加
@dev 后缀(composer require vendor/name:dev-main@dev)、根项目设 "minimum-stability": "dev"、或临时加 --stability=dev 参数
- 注意
prefer-stable: true 不影响安装,它只是“在满足 minimum-stability 前提下优先选 stable”,不解决找不到 dev 分支的问题
- 运行
composer show -a vendor/name 能看到所有可用分支和标签,如果列表里没有 dev-main,说明该分支要么没推送到远程,要么没被 Packagist 抓取
装了预览版或 dev 分支后,怎么安全回退?
预览版出问题,composer self-update --stable 一行就切回最新稳定版;dev 分支装错了,composer require vendor/name:2.5.0(或任意稳定版号)就能覆盖掉。
- 不建议靠删
vendor 和 composer.lock 回退,依赖关系可能被破坏
-
composer update vendor/name 不会自动切回 stable,它只按当前 composer.json 中写的约束更新,所以改完版本号后一定要显式执行
- 私有仓库或 fork 的包,回退时别忘了同步清理
repositories 配置,否则下次 update 还可能拉错源
@dev 后缀(composer require vendor/name:dev-main@dev)、根项目设 "minimum-stability": "dev"、或临时加 --stability=dev 参数 prefer-stable: true 不影响安装,它只是“在满足 minimum-stability 前提下优先选 stable”,不解决找不到 dev 分支的问题 composer show -a vendor/name 能看到所有可用分支和标签,如果列表里没有 dev-main,说明该分支要么没推送到远程,要么没被 Packagist 抓取 composer self-update --stable 一行就切回最新稳定版;dev 分支装错了,composer require vendor/name:2.5.0(或任意稳定版号)就能覆盖掉。
- 不建议靠删
vendor和composer.lock回退,依赖关系可能被破坏 -
composer update vendor/name不会自动切回 stable,它只按当前composer.json中写的约束更新,所以改完版本号后一定要显式执行 - 私有仓库或 fork 的包,回退时别忘了同步清理
repositories配置,否则下次update还可能拉错源
分支名拼写、远程是否存在、稳定性设置这三点,漏一个就会卡住。很多人试了三遍都失败,其实只是 dev-main 写成了 dev-master,而目标项目早已废弃 master。










