
composer install 时怎么确保用的是 lock 文件里的版本
这是导出配置的前提——如果 composer install 没走 composer.lock,那导出的就不是实际运行的依赖。默认它确实会优先读 lock,但有两个常见破坏点:
- 项目里没提交
composer.lock,或者你本地删了它,composer install就会退化成composer update行为,重新解析最新兼容版本 - 执行过
composer update但没提交新 lock,别人拉代码后 install 的其实是旧 lock 里的旧版本,和你本地不一致
验证方法很简单:运行 composer install --dry-run,看输出里有没有 “Installing” 行;如果有且没报错,说明 lock 可用。否则先 git checkout composer.lock 或让队友推一次 lock。
composer.json 不含 dev 依赖,怎么导出完整运行时依赖列表
composer.json 默认只声明 require,但很多工具链(比如 CI 构建、Docker 镜像打包)需要知道「实际跑起来到底装了哪些包」,包括 require-dev 里那些测试、Linter 工具。这时候不能只靠看 json 文件。
-
composer show --locked --format=json输出的是 lock 文件解析后的完整包列表(含 dev),JSON 格式可直接重定向保存:composer show --locked --format=json > dependencies.json - 如果只要包名+版本(更轻量),用
composer show --locked --no-ansi | sed 's/ */ /g' | cut -d' ' -f1,2提取两列,再转成 JSON 也行 - 注意:
--locked是关键,漏掉就变成查当前composer.json声明,不是真实安装状态
导出的 JSON 怎么用于离线环境或审计
导出的 JSON 本质是快照,但它不含下载地址、校验和、源类型等元数据,所以不能直接给 composer install --no-network 用。它更适合人工核对或脚本消费。
- 审计场景:对比两个环境的
dependencies.json差异,用diff -u old.json new.json | grep '^\+[a-z]'快速抓新增包 - 离线部署:得配合
composer install --no-install+composer archive打 zip 包,或者用composer install --prefer-dist --no-scripts后打包vendor/ - 安全扫描:有些 SCA 工具(如
phpstan插件、roave/security-advisories)能直接读取 lock 文件,比 JSON 更可靠
为什么不用 composer dump-autoload 导出依赖关系
composer dump-autoload 生成的是自动加载映射(vendor/autoload.php 相关),和依赖列表完全无关。有人误以为它能“导出配置”,其实只是刷新类加载器。
- 它不改变
composer.json或composer.lock,也不输出任何依赖信息 - 执行后看不到任何包名或版本,只有 “Generating autoload files” 这类提示
- 真要检查 autoloading 是否生效,用
composer dump-autoload --no-scripts --dry-run看是否报错即可
真正要备份或迁移依赖,盯死 composer.json 和 composer.lock 两个文件就行,JSON 导出只是辅助手段,别把它当权威来源——lock 文件才是唯一真相。










