composer install 不下载新包是因为它只依据 composer.lock 文件还原依赖,忽略 composer.json 中手动新增或修改的 require;必须用 composer require 或 composer update 同步 lock 文件。

composer install 为什么有时不下载新包?
因为 composer install 只读 composer.lock,不看 composer.json 里新增或改过的 require。如果你刚手动编辑了 composer.json 加了一个包,但没运行 composer update 或 composer require,composer install 就会完全忽略它——它只忠实地还原 lock 文件记录的版本。
常见错误现象:
- 修改
composer.json后执行composer install,vendor 里没出现新包 - CI 环境部署失败,提示类找不到,但本地
composer require是成功的
正确做法:
- 添加依赖必须用
composer require vendor/package(自动写入 json + 更新 lock + 下载) - 手动改
composer.json后,必须紧接着跑composer update vendor/package或全量composer update(慎用) - 团队协作时,
composer.lock必须提交到 Git;否则composer install在别人机器上就失去意义
如何让旧项目代码被 Composer 自动加载?
旧项目通常没有命名空间、类文件散落在 ./lib、./classes 等目录,不能直接用 PSR-4。这时得靠 classmap 告诉 Composer:“这些路径下的所有 PHP 文件,我都可能用到”。
操作步骤:
- 在
composer.json的autoload字段下加"classmap": ["./lib", "./models", "./helpers"] - 运行
composer dump-autoload(不是install或update) - 确保旧类名和文件名严格匹配(例如
DbHelper.php里必须是class DbHelper) - 如果类里用了
require_once手动引入其他文件,要逐步删掉——自动加载会接管
注意:classmap 是一次性扫描生成映射表,后续增删文件需重新运行 dump-autoload;它不支持动态发现,也不检查命名空间。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer update 全量升级为什么危险?
composer update(不带参数)会无视 composer.lock,重新解析 composer.json 中所有约束,拉取每个依赖能匹配到的最新小版本甚至次版本(比如从 ^3.2 升到 3.9),还顺带升级它们的子依赖。一旦某个包在新版本里改了方法签名、删了类、或破坏了 BC,你的代码当场报 Class not found 或 Call to undefined method。
更隐蔽的问题:
-
guzzlehttp/guzzle从 v7 升到 v8 可能导致 HTTP 客户端构造方式变更 -
monolog/monologv2 升 v3 后,LoggerInterface的log()方法参数顺序调整 - 某些包的次版本升级会悄悄要求更高 PHP 版本(如从 7.4 → 8.0),而你的服务器还没升
安全做法:
- 只更新明确需要的包:
composer update monolog/monolog guzzlehttp/guzzle - 加
--with-all-dependencies控制子依赖范围(默认只更新直系) - 上线前在测试环境跑
composer update --dry-run预览变更
生产环境部署时该用哪个命令?
线上服务器不该运行 composer install 默认行为:它会装 require-dev 里的包(如 PHPUnit)、生成冗余的 autoload 逻辑、甚至触发脚本(post-install-cmd)。这些既浪费时间又增加攻击面。
推荐命令:
composer install --no-dev --optimize-autoloader --no-interaction-
--no-dev:跳过require-dev,减小 vendor 体积、避免 dev-only 类被误加载 -
--optimize-autoloader:把 PSR-4 映射转成静态数组,提升自动加载速度(尤其对无 OPcache 的环境) -
--no-interaction:防止卡在交互式提示(如权限确认),适合 CI/CD 流水线
额外提醒:如果项目用了 classmap,--optimize-autoloader 对它无效;且该参数不会影响 classmap 扫描结果,仍需手动 dump-autoload。










