composer create-project 默认用 ^ 版本约束(如 "^2.0"),完全不读全局配置,只依据目标项目 composer.json 的 require 字段;未明示时自动采用 ^,无法全局修改,默认行为只能通过自定义 skeleton 模板或手动指定版本控制。

Composer 没有全局“默认版本约束”开关,所谓“设置默认”,本质是控制 create-project 行为或模板文件内容。
composer create-project 用什么版本约束?
它完全不读你的全局配置,只照目标项目 composer.json 里的 require 字段拉取——没写明版本时,默认用 ^(如 "monolog/monolog": "^2.0")。这个行为无法通过 config 或环境变量覆盖。
- 执行
composer create-project laravel/laravel myapp,实际装的是 Laravel 官方 skeleton 里composer.json写的约束,不是你本地偏好 - 想让新项目默认用
~2.0而不是^2.0?只能自己维护一个 skeleton 项目,把"php": "~8.1.0"这类约束写死在它的composer.json里 - 临时指定版本:加具体版本号,比如
composer create-project symfony/skeleton myapp "6.4.*",注意不能带空格、不能用@或=
composer require 为什么没按你写的约束走?
它不是“照着你输的字符装”,而是根据当前项目的 config.platform 和 minimum-stability 反向推导出一个满足条件的约束,再选最新兼容版。你看到的 ^2.0.0 很可能是推导结果,不是你手动写的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
config.platform.php设成"8.0",可能跳过只支持8.1+的包,哪怕你写了"^3.0" -
minimum-stability是stable,但你没加@dev,dev-main就不会被考虑 - 执行
composer require guzzlehttp/guzzle:~7.5成功,不代表所有包都支持~;有些包没发7.5.xtag,~7.5就永远匹配不到 - 运行
composer show guzzlehttp/guzzle --all看真实可用 tag,比猜更可靠
镜像源配置为什么经常不生效?
优先级和键名错位是主因:只要项目级 composer.json 里有 "repositories": {}(哪怕空对象),全局镜像就被彻底屏蔽;且 repos.packagist.org 和 repo.packagist 在不同 Composer 版本中行为不一致。
- 验证当前生效的是哪个:进项目目录后运行
composer config repo.packagist和composer config repos.packagist.org,非空的那个才起作用 - CI/CD 中用
sudo composer config -g,很可能写进了root用户配置,而构建进程以普通用户运行,根本读不到 - 配置写对 ≠ 请求走镜像:必须用
composer diagnose或抓包看实际请求域名,否则只是“看起来配好了” - URL 末尾缺
/、协议写成http(而非https)、缓存未清,都会导致静默失效
真正可控的只有三件事:模板 composer.json 里怎么写、当前项目 config.platform 怎么设、以及每次 require 或 create-project 时是否显式传版本字符串。其他地方试图“设默认”,大概率白忙活。










