composer.json是composer依赖管理的唯一事实来源,必须置于项目根目录;它定义依赖、自动加载及元数据,缺失则无法触发安装、加载或版本锁定逻辑。

composer.json 是 Composer 依赖管理的唯一事实来源,没它就等于没依赖管理——不是“不能用”,而是根本不会触发任何自动安装、加载或版本锁定逻辑。
composer.json 文件必须放在项目根目录
Composer 只会在当前工作目录下找 composer.json;它不会向上递归查找父目录,也不会识别子目录里的同名文件。如果你在 src/ 或 app/ 里放了 composer.json,composer install 会报错 No composer.json found in the current directory。
常见错误现象:
- 执行
composer require后提示找不到composer.json,其实是当前终端没进对目录 - IDE 自动创建了
composer.json但位置错了(比如建在vendor/下),结果vendor/被清空后配置也丢了
正确做法:
- 新建项目先
mkdir myproject && cd myproject,再composer init或手写composer.json - 已有代码想接入 Composer?把
composer.json放到最外层,和index.php或public/同级
require 和 require-dev 的区别直接影响部署行为
require 里的包会在 composer install 和 composer update 时无条件安装,生产环境也必须存在;require-dev 只在开发阶段需要,比如 phpunit/phpunit 或 friendsofphp/php-cs-fixer,运行 composer install --no-dev 时会被跳过。
容易踩的坑:
- 误把测试工具写进
require,上线后多装一堆无关代码,还可能引入安全风险 - CI/CD 流水线没加
--no-dev,导致生产镜像体积膨胀、启动变慢 -
require-dev里的包如果用了 PSR-4 自动加载,其类在生产环境不可用——这不是 bug,是设计如此
示例片段:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
{
"require": {
"monolog/monolog": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "^10.5"
}
}
autoload 配置不生效?多半是路径或命名空间写错了
PSR-4 自动加载靠 "autoload": {"psr-4": {...}} 声明,但它的值不是“随便写个路径就行”。格式必须是 "命名空间\": "相对路径/",末尾斜杠不能少,路径是相对于 composer.json 所在目录的。
典型问题:
- 写成
"App\": "src"(缺斜杠)→AppFoo会去查srcFoo.php,而不是src/Foo.php - 路径写成绝对路径如
/var/www/myapp/src/→ Composer 直接忽略该条目,不报错但也不加载 - 命名空间结尾没加双反斜杠,比如
"App": "src/"→ PHP 解析时会当成常量App,报Class 'AppFoo' not found
验证方式:改完 composer.json 后必须运行 composer dump-autoload,否则新增的映射不会写入 vendor/autoload.php。
composer.lock 不该手动编辑,但必须提交进 Git
composer.lock 是 composer install 的执行依据,它记录了每个包的确切版本、哈希值和依赖树。你本地 composer update 后它会变,但只要不提交,队友 git pull 后运行 composer install 就还是旧版本。
关键点:
- CI 环境、Docker 构建、线上部署都依赖
composer.lock—— 没它,install会退化成update,结果不可控 - 有人为“省事”删掉
composer.lock再install,这等于放弃版本锁定,团队协作和回滚能力直接归零 - 若需更新某一个包(如只升
guzzlehttp/guzzle),用composer update guzzlehttp/guzzle,别碰lock文件本身
复杂点在于:composer.lock 里包含平台配置(PHP 版本、扩展)、插件信息等,不同环境生成的 lock 文件可能不兼容——所以务必确保所有开发者和 CI 使用一致的 PHP 版本和扩展集。










