composer.json 关键字段填错会导致安装失败或装错包:name 和 version 必须成对出现才被识别为可发布包;vendor 名仅允许小写字母、数字和短横线;require-dev 依赖默认随 install 安装,需 --no-dev 才跳过;psr-4 路径须带末尾斜杠;scripts 中应使用 ./vendor/bin/ 下工具而非全局命令。

composer.json 不是配置越全越好,关键字段填错一个,composer install 就可能失败或装错包。
name 和 version 字段必须成对出现才被识别为可发布包
只有当你想把项目发布到 Packagist 或私有仓库时,name(格式为 vendor/name)和 version 才是必需的。本地开发项目可以省略 version,但一旦写了 name 却没写 version,Composer 会把它当“无版本包”处理——某些命令(如 composer require 指定版本)会报 Could not find package。
-
name中的 vendor 名不能含大写字母、下划线或点号,只允许小写字母、数字、短横线 - 如果用
composer init生成,它默认帮你填了version,但实际应删掉——让 Composer 从 Git tag 自动推断更可靠 - 私有包若走
path仓库类型,version可以是dev-main这类分支别名,但必须和源目录下的composer.json一致
require 和 require-dev 的依赖隔离不是靠文件分开,而是靠命令开关
require 里的包在 composer install --no-dev 或生产环境部署时会被跳过;require-dev 里的包(比如 phpunit/phpunit)默认也会装,除非你显式加 --no-dev。很多人误以为只要不写 --dev 就不会装 dev 包,其实相反。
-
composer install默认装全部,包括require-dev -
composer update默认也更新require-dev,除非加--no-dev - CI/CD 脚本里漏掉
--no-dev,可能导致生产镜像里多出测试工具,增大体积甚至引入安全风险
autoload 的 psr-4 配置路径必须是相对于 composer.json 的,且结尾要带反斜杠
"psr-4": {"App\": "src/"} 是正确写法;写成 "App\": "src"(缺末尾斜杠)会导致 Composer 找不到 src/Foo.php 里的 App\Foo 类——它会去查 srcFoo.php。
- 路径支持多个映射,但不能有重叠前缀,否则后定义的会覆盖前定义的
- 如果用
classmap,路径值必须是目录或文件,且需运行composer dump-autoload才生效 - 修改 autoload 后忘记执行
composer dump-autoload,Class not found错误不会提示哪行配置错了,只会报加载失败
scripts 字段里自定义命令不能直接调用 shell 别名或未声明的二进制
"scripts": {"test": "phpunit"} 看似简洁,但 phpunit 必须已全局安装或在 vendor/bin/ 下存在。更稳妥的是写成 "./vendor/bin/phpunit" 或 "php ./vendor/bin/phpunit"。
- 脚本中用
$COMPOSER_BIN_DIR环境变量比硬编码vendor/bin更健壮 - 多个命令用
&&连接时,前一个失败会导致整个 script 中断,可用|| true绕过(但慎用,会掩盖真实错误) - script 名称不要和 Composer 内置命令冲突,比如叫
install会导致composer install执行你的脚本而非原逻辑
字段之间存在隐式依赖:比如 autoload 生效的前提是 name 合法;scripts 能否执行又取决于 require-dev 里是否装了对应工具。这些链路不报错,但会让问题排查变成拼图游戏。










