require字段仅支持packagist包名+语义化版本约束;禁用本地路径、git url、分支名、系统库名(如lib-curl);精确锁定需用=2.1.0,"2.1.0"会被转为^2.1.0。

require 字段只认 Packagist 包名 + 语义化版本约束,写错格式不会报错,但会装错包、锁死错误版本、甚至让 CI 跑不通。
require 里不能写什么
你不能在 require 里写本地路径、Git URL、分支名或系统库名——这些全都不被识别为合法依赖。
-
"mylib": "./libs/mylib":Composer 直接忽略,不报错也不安装 -
"guzzlehttp/guzzle": "dev-main":默认被当不稳定版拒装,除非加--stability=dev -
"lib-curl": ">=7.64.0":报错Packagelib-curl not found,lib-前缀只在config.platform里有效 -
"phpunit/phpunit": "^9.0"放进require:它会被部署到生产环境,白占磁盘还可能因扩展缺失启动失败
版本约束怎么写才真正生效
版本号不是“写上去就管用”,不同符号触发完全不同的解析逻辑,且 Composer 会自动简化你输入的格式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 要精确锁定 v2.1.0,必须写
"monolog/monolog": "=2.1.0"或命令行composer require monolog/monolog=2.1.0;写成"monolog/monolog": "2.1.0"会被转成^2.1.0,允许升到 2.9.9 -
^2.1等价于^2.1.0,不是“只允许 2.1.x”,而是>=2.1.0 -
~2.1.0是>=2.1.0 ,比 <code>^更窄,适合 patch 级有兼容风险的场景 - 含字母的版本(如
v1.0.0-RC1)必须加引号:'"vendor/pkg": "v1.0.0-RC1"',否则 shell 会截断
require 变动后,autoload 不更新是常见盲区
你改了 composer.json 的 require,运行 composer install 或 composer update 后,类还是 Class not found?大概率是 autoload 没刷新。
- Composer 不会在每次 install/update 时自动重生成 autoload 映射,尤其当你删包、换命名空间或加新 PSR-4 规则时
- 必须显式执行
composer dump-autoload,否则vendor/autoload.php里没注册新包的 namespace - 某些包(如
illuminate/support)自带 autoload 配置,一旦进require,就会永久污染整个项目的自动加载路径——哪怕你一行Illuminate\都没用
最麻烦的不是语法写错,而是改完 composer.json 没跑 composer update --lock,导致 composer.lock 和 json 不一致;线上部署只认 lock 文件,你写的约束根本没生效。










