composer.json 由 composer init 交互生成或手动创建,若 init 时包名为空则静默失败;其声明依赖,composer.lock 是 install/update 后生成的精确快照,必须提交至 Git 协作项目。

composer.json 不是“导出”出来的,而是由 composer init 交互生成,或手动创建后通过 composer install 衍生出锁文件和依赖目录。
为什么 composer init 后没看到 composer.json?
常见错误现象:运行 composer init 后直接按回车跳过所有步骤,最后提示 “Writing composer.json into current directory”,但当前目录实际没有该文件。
- 根本原因:交互过程中某一步输入了空值(比如包名留空),
composer会中止写入,但不报错,只静默退出 - 正确做法:至少填一个合法的
name(格式必须是vendor/name,如myorg/myapp),否则初始化失败 - 更稳妥的方式:用
-n跳过交互,配合--name、--description等参数一次性生成:composer init --name="myorg/myapp" --description="My CLI tool" --require="php:^8.1" -n
composer.json 和 composer.lock 的关系容易搞混
新手常以为 composer.lock 是“导出”的结果,其实它只是 composer install 或 composer update 后自动生成的依赖快照。
-
composer.json是你写的声明(你要什么包、什么版本约束) -
composer.lock是composer算出来的精确结果(具体用了哪个 commit / 版本号,含哈希校验) - 删掉
composer.lock再跑composer install,会重新解析composer.json并生成新锁文件——但结果可能和之前不同(尤其用了^或~约束时) - 所以协作项目中,
composer.lock必须提交进 Git;单人脚本类项目可酌情忽略,但得清楚后果
初始化后想改 composer.json 怎么办?
别再跑一遍 composer init —— 它不会覆盖已有文件,也不会合并字段,只会报错 “composer.json already exists”。
- 直接手动编辑
composer.json,改完后运行composer validate校验格式是否合法 - 加依赖用
composer require vendor/package,它会自动更新composer.json和composer.lock - 删依赖用
composer remove vendor/package(Composer 2.2+),旧版本只能手动删 +composer update vendor/package - 注意:修改
autoload字段后,必须运行composer dump-autoload才生效,否则class not found错误不会消失
真正容易被忽略的是:初始化只是起点,composer.json 的结构、字段语义、版本约束写法,直接影响后续依赖是否可装、能否复现、会不会在 CI 中失败。哪怕只是写个小工具,也建议花两分钟看一眼官方 schema 文档里 require、autoload、scripts 这几个字段的最小可用组合。










