该用 composer install——除非明确要升级依赖。install 读取 composer.lock 严格复现依赖树;update 忽略 lock 文件重新解析,易致环境不一致;生产部署、CI/CD 必须用 install 并加 --no-dev 参数。

composer install 和 composer update 到底该用哪个?
用 composer install,不是 composer update——除非你明确要升级依赖。
composer install 读取 composer.lock,严格复现已知可用的依赖树;composer update 忽略 lock 文件,按 composer.json 重新解析并可能升到新版本,极易导致本地和线上行为不一致。
- 团队协作、CI/CD 构建、上线部署:必须用
composer install - 主动升级某个包(如修复 CVE):先改
composer.json,再执行composer update vendor/package-name,避免全量更新 - 如果项目没有
composer.lock,install会退化成update行为,风险极高
常见错误现象:Class not found、Function undefined、CI 构建通过但线上报错——八成是有人在部署机上手抖敲了 composer update。
生产环境怎么跳过 dev 依赖?
加 --no-dev 参数:用 composer install --no-dev,而不是删掉 require-dev 或搞多个 composer.json。
--no-dev 只控制安装行为,不影响 autoload-dev 的定义,也不修改任何配置文件,是最轻量、最可控的方式。
- Dockerfile 中应写:
RUN COMPOSER_DEV_MODE=0 composer install --no-dev --optimize-autoloader - GitHub Actions 等 CI 脚本里漏掉这个参数,就会把
phpunit、laravel-debugbar打进生产镜像 -
COMPOSER_DEV_MODE=0效果等同--no-dev,但不如参数明确,且容易被覆盖
注意:--no-dev 不等于“禁用测试代码自动加载”——如果业务代码里硬引用了 Tests* 类,运行时仍会报错,得靠代码层隔离。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
多个 PHP 版本下,composer 用的是哪个 php?
它用的是 $PATH 里第一个 php,不是 composer.json 里的 config.platform.php,也不是你 php -v 看到的那个。
config.platform.php 只影响依赖解析时的版本兼容性判断,完全不改变实际执行 composer 的 PHP 解释器。
- 检查真实调用链:
head -n1 $(which composer),看 shebang 是不是#!/usr/bin/env php - 临时切换:直接指定路径,例如
/opt/homebrew/bin/php83 /usr/local/bin/composer install - 推荐 alias:
alias composer83='COMPOSER_PHP=/opt/homebrew/bin/php83 composer'(Composer 2.2+ 原生支持)
常见错误现象:This package requires php >=8.3 报错,但 php -v 显示 8.3——说明 composer 实际跑在另一个 php 上,比如系统默认的 8.1。
vendor/autoload.php 为什么在不同项目间“串场”?
因为 vendor/autoload.php 是生成时快照,它的 autoload_static.php 里硬编码了当前项目的 PSR-4 映射和类列表,不会随目录切换自动刷新。
每次 cd 到新项目根目录后,如果没清理旧 vendor/,就可能复用上一个项目的 autoloader,导致 Class not found 或路径映射错乱。
- 切换项目前,确认当前目录含
composer.json - 删除旧
vendor/和composer.lock(尤其当你从 Laravel 10 切到 Laravel 11 时) - 不要依赖全局
~/.composer/config.json设置私有源——它会和项目内repositories冲突,应让每个项目自己配
这点最容易被跳过:你以为只是换了个目录,其实 autoload 已经在“假装”加载另一个项目的结构。

















