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

name 和 version 字段必须成对出现,否则 composer install 会报错
Composer 不允许只写 name 不写 version,哪怕你用的是开发版。它默认把包当作“无版本”处理,而 composer install 在解析依赖时会直接拒绝加载——错误信息通常是:Could not parse version constraint *: Invalid version string "*"。
- 如果你在写私有包或本地测试,
version填dev-main或1.0.0-x-dev是安全的 - 发布到 Packagist 的包,
version必须和 Git tag 严格一致(比如 tag 是v2.1.0,version就得是2.1.0) -
name格式必须是vendor/name(如monolog/monolog),中间斜杠不能少,也不能用下划线或大写字母
require 和 require-dev 的区别不是“要不要装”,而是“什么时候装”
很多人以为 require-dev 是可选依赖,其实它和 require 一样都会被 composer install 安装——除非加了 --no-dev 参数。CI 环境、生产部署常加这个参数,这时 require-dev 里的包(比如 phpunit/phpunit、friendsofphp/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都跑,别指望它做通用初始化










