必须用composer install且确保composer.lock存在——它能精确复现包名、版本、commit hash和安装路径哈希;composer update会重新解析composer.json,导致版本偏移、bc break和构建不一致。

直接用 composer install,前提是项目根目录下有有效的 composer.lock 文件——这是唯一能精确复制依赖环境的操作,其他方式(比如 composer update、composer require 或手动拷 vendor)都会导致版本偏移、哈希不匹配或 autoload 失效。
为什么不能用 composer update 来“同步”别人项目的依赖
composer update 的本质是重新解析 composer.json,忽略 composer.lock,然后求解最新兼容版本。结果往往是:
- 装上
monolog/monolog3.6.0 而不是 lock 里锁死的 3.5.0,可能触发未测试的 BC break - Git 包被拉取新 commit,但原项目依赖的是特定 hash,行为已不可复现
- CI 流水线跑出和本地不同的构建产物,线上偶发
Class not found
composer install 执行前必须确认的三件事
看似一行命令,失败常因隐性前提缺失:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
composer.lock必须存在且未被.gitignore屏蔽(检查ls -la | grep composer.lock) -
vendor/目录必须为空或不存在(rm -rf vendor再运行,否则旧文件残留干扰 autoload) - 当前 PHP 版本需满足 lock 中
"platform": {"php": ">=8.1"}这类声明(用php -v和grep -A5 '"platform"' composer.lock对比)
U 盘拷贝 vendor 后为什么 vendor/autoload.php 找不到类
因为 vendor/autoload.php 默认写的是源机器的绝对路径(尤其 Windows → Linux 场景),且 classmap 缓存未适配目标机。必须在目标机执行:
-
composer dump-autoload --optimize(重生成 autoload,跳过旧路径) - 确保
src/等自定义 autoload 路径存在且权限可读(Linux 下 U 盘挂载常带noexec或 uid/mask 错误) - 禁用
--classmap-authoritative,除非你刚完整扫描过所有类(U 盘迁移后通常没扫过)
离线环境下让 composer install 不联网的关键动作
哪怕只差一个包,Composer 默认也会连 packagist.org。要彻底断网运行,得靠 composer.lock 里的 dist URL 和 hash:
- 源机器打包前务必执行
composer install --prefer-dist --no-dev,确保 lock 中记录的是 dist 归档而非 source - 把整个项目(含
composer.json、composer.lock)和vendor/一起拷到 U 盘——但注意:vendor 只作参考,目标机仍要删掉再装 - 目标机运行:
composer install --no-interaction --no-progress --prefer-dist,它会严格按 lock 里的 dist URL 解压,不查网络
最容易被忽略的是 composer.lock 里的 content-hash 字段——它校验的是 composer.json 内容,一旦 json 被手改(比如加了注释、调整了空格),install 就会拒绝执行,报错 “The lock file does not contain require-dev information”。这种细节不报错提示,只静默失败。










