composer.json常用字段说明_composer配置参数详解

name 和 version 必须成对出现,否则 composer install 报错;require-dev 与 require 均会安装,仅 –no-dev 可跳过;php 版本约束须写在 require 中;autoload 错误不提示具体原因;scripts 工作目录为项目根目录。

composer.json常用字段说明_composer配置参数详解

name 和 version 字段必须成对出现,否则 composer install 会报错

Composer 不允许只写 name 不写 version,哪怕你用的是开发版。它默认把包当作“无版本”处理,而 composer install 在解析依赖时会直接拒绝加载——错误信息通常是:Could not parse version constraint *: Invalid version string "*"

  • 如果你在写私有包或本地测试,versiondev-main1.0.0-x-dev 是安全的
  • 发布到 Packagist 的包,version 必须和 Git tag 严格一致(比如 tag 是 v2.1.0version 就得是 2.1.0
  • name 格式必须是 vendor/name(如 monolog/monolog),中间斜杠不能少,也不能用下划线或大写字母

require 和 require-dev 的区别不是“要不要装”,而是“什么时候装”

很多人以为 require-dev 是可选依赖,其实它和 require 一样都会被 composer install 安装——除非加了 --no-dev 参数。CI 环境、生产部署常加这个参数,这时 require-dev 里的包(比如 phpunit/phpunitfriendsofphp/php-cs-fixer)就完全不会进 vendor。

  • require 里的包,会被所有环境安装;require-dev 里的包,只在开发环境生效(但需手动控制)
  • 如果某个包既被运行时调用又被测试用到(比如 symfony/var-dumper),别图省事全塞进 require-dev,否则线上 dump() 会报错
  • PHP 版本约束写在 require 里才有效,require-dev 中的 php 条目会被忽略

autoload 配置写错会导致类找不到,且错误不提示具体哪行没映射上

Composer 自动加载失败时,PHP 报的错永远是 Class 'Xxx' not found,不会告诉你是因为 psr-4 路径拼错了,还是 files 数组里有个不存在的文件。最常见问题是路径没对齐命名空间。

  • "psr-4": {"App": "src/"} 表示 AppFooBar 对应 src/Foo/Bar.php,注意末尾斜杠和命名空间结尾反斜杠都要有
  • classmap 扫描目录时,确保目录存在且可读;如果扫了空目录,composer dump-autoload 不报错,但生成的 vendor/composer/autoload_classmap.php 里啥也没有
  • files 列表里的 PHP 文件会在每次请求时自动 include,适合放函数定义,但别放耗时逻辑——它不走 opcode 缓存优化

scripts 字段执行命令时,当前工作目录是项目根目录,不是 vendor/bin

scripts 时容易默认命令在 vendor/bin 下执行,其实不是。"post-install-cmd": "php artisan optimize" 这种写法能跑通,是因为 artisan 在项目根目录,而 Composer 会把 vendor/bin 加进 $PATH,所以 php-cs-fixer 这类工具也能直接调。但一旦涉及相对路径,就容易翻车。

  • "test": "phpunit tests/Feature" 是对的;"test": "cd tests && phpunit Feature" 是错的——cd 后的路径变化不会保留到下一条命令
  • 想用环境变量控制行为?scripts 里不能直接写 export FOO=bar,得包装成 shell 脚本或改用 composer run-script + 外部脚本
  • 钩子名如 pre-autoload-dump 只在 composer dump-autoload 时触发,不是每次 install 都跑,别指望它做通用初始化

事情说清了就结束。最麻烦的其实是 autoload 和 scripts 的路径逻辑——它们不报错,但一跑就挂,而且挂得无声无息。