结论:用 composer install 装依赖,用 composer require 加新包,别手动改 vendor 或 composer.json——90% 的依赖问题源于此。因为 vendor/autoload.php 依赖 composer.lock 锁定的精确版本与目录结构,仅复制 vendor 不运行 install 会导致 Class not found 或 autoload.php 加载失败;install 校验 lock、下载一致包并生成正确映射,无 lock 时行为等同 update,可能引入非预期版本。

直接说结论:用 composer install 装依赖,用 composer require 加新包,别手动改 vendor 或 composer.json —— 90% 的依赖问题都出在这一步乱动。
为什么不能跳过 composer install 直接跑项目
因为 vendor/autoload.php 不是“有文件就能用”,它依赖 composer.lock 中锁定的精确版本和目录结构。如果你只复制了别人项目的 vendor 文件夹,但没运行 composer install,PHP 可能报 Class not found 或 Failed opening required 'vendor/autoload.php'。
-
composer install会校验composer.lock,下载完全一致的包(含子依赖版本),并生成正确的自动加载映射 - 若项目没有
composer.lock,composer install行为等同于composer update,可能装出非预期版本 - CI/CD 流水线中必须用
composer install --no-dev(生产环境不装开发依赖)
composer require 和手动改 composer.json 的区别
表面看都是往 require 字段加一行,但实际影响完全不同:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer require monolog/monolog:^3.0会:下载包 + 写入composer.json+ 更新composer.lock+ 生成 autoload 映射 - 手动编辑
composer.json后只执行composer install:不会下载新包(因为composer.lock里没记录),反而可能报错 “Your requirements could not be resolved” - 如果要删包,必须用
composer remove monolog/monolog,而不是只删composer.json里的行
国内环境下必须处理的镜像源问题
默认连 packagist.org 极大概率超时或 404,尤其在 CI 环境或 Docker 构建中。不设镜像,composer install 卡住是常态,不是偶然。
- 全局设置(推荐):
composer config -g repo.packagist composer https://packagist.phpcomposer.com - 项目级设置(更安全):
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(阿里云源目前最稳) - 验证是否生效:运行
composer show -p,看到 URL 是镜像地址即成功 - 注意:某些旧版 Composer(https://mirrors.aliyun.com/composer/,得降级用
https://packagist.phpcomposer.com
autoload 配置写错导致类找不到的典型场景
很多人以为只要 require vendor/autoload.php 就万事大吉,但如果你的项目代码用了 PSR-4 自动加载,而 composer.json 里没配对,new App\Controller\Home() 依然会报错。
- 正确写法示例(假设源码在
src/目录):"autoload": { "psr-4": { "App\": "src/" } } - 改完后必须运行
composer dump-autoload,否则新增的命名空间不会被识别 - 测试是否生效:
composer dump-autoload -v会打印扫描到的路径;也可临时加个die(class_exists('App\Controller\Home') ? 'OK' : 'FAIL'); - 不要把
src/写成./src/或src(少斜杠),Composer 对路径格式敏感
最常被忽略的一点:composer.lock 不是“可选文件”。它决定了所有协作者和部署环境装的是同一套依赖。删掉它、提交时忽略它、或者用不同版本 Composer 生成它,都会让“在我机器上好好的”变成线上故障。

















