composer create-project 默认按项目 composer.json 的 require 字段拉取版本,未明示时用 ^ 约束;无法全局设默认约束,需通过自定义 skeleton 模板或手动指定版本控制。

composer create-project 默认用什么版本?
它不读你全局配置,而是按项目 composer.json 里写的 "require" 来拉——没写明就默认用 ^(如 "monolog/monolog": "^2.0"),也就是兼容性宽松的语义化版本约束。你改不了它的“默认”,但能控制它拉哪个版本。
想让所有新项目默认用 ~2.0 而不是 ^2.0 怎么办?
Composer 没有全局“默认版本约束”开关。所谓“设置默认”,本质是控制 create-project 命令的行为或初始化模板里的 composer.json 结构:
- 手动指定版本:运行时加
--stability=stable和显式写死版本,比如composer create-project laravel/laravel myapp "10.*" - 用自定义模板:把常用约束写进自己的 skeleton 项目(比如
"php": "~8.1.0"),再用composer create-project your/skeleton - 别依赖“默认”:
create-project本身不会自动帮你加~或^,它只照着目标项目的composer.json复制——所以真正可控的是那个模板文件本身
为什么 composer require 不按你预设的约束走?
因为 composer require 的行为由当前项目的 config.platform 和 minimum-stability 决定,不是全局配置说了算:
hdhcms网站支持PC、手机版,同时后台支持公众号的接入,包括微信服务号订阅号,可以设置自动回复及服务号菜单及认证订阅号菜单。 1、网站上线方法: 1.1本网站运行环境为:IIS6.5+SQLITE 1.2将网站解压到网站目录 1.3数据库默认为SQLITE,包括在解压目录内,无须修改 1.4 完成上面的配置后通过所绑定的域名即可运行2网址访问及后台访问配置
-
config.platform.php会伪造运行环境,影响包的版本选择(比如设成"8.0",可能跳过只支持8.1+的新版) -
minimum-stability默认是stable,但如果你在require时不加@dev,它就不会选dev-main这类分支别名 - 执行
composer require foo/bar时,它实际查的是该包的最新 stable tag,并按当前platform和stability规则反向推导出一个满足条件的约束(通常是^x.y.z)
composer config --global 设置哪些东西真有用?
全局 config 只影响行为策略,不干预版本约束逻辑:
-
composer config --global github-oauth.github.com xxx:解决私有库鉴权 -
composer config --global process-timeout 3600:避免大包安装超时中断 -
composer config --global store-auths false:禁用密码存本地,适合 CI -
composer config --global allow-plugins true:允许第三方插件运行(5.6+ 强制交互确认)
试图用 composer config --global version-constraint "~" 是无效的——这个配置项根本不存在。
真正要统一约束风格,得靠团队模板、CI 检查脚本,或者用 composer normalize(第三方工具)来标准化 composer.json 格式。没人绕得过手写或生成 require 那一行。









