config.platform 必须置于 composer.json 的 config 对象内,值需为完整语义化版本(如"8.1.10"),仅影响 update 时依赖解析,不改变运行环境;命令行 --platform 优先级更高,适合 ci 跨平台构建,但无法模拟 os 或架构。

config.platform 必须写在 composer.json 的 config 对象里
很多人把 "platform" 直接写在 composer.json 根层级,结果完全不生效。正确位置是 "config" 字段下的子对象。Composer 只认这个路径,其他地方写的 platform 都被忽略。
常见错误写法:"platform": {"php": "8.1.10"}(根级,无效)
正确写法:
{
"config": {
"platform": {
"php": "8.1.10",
"ext-mbstring": "8.1.10",
"ext-openssl": "8.1.10"
}
}
}
-
config.platform.php值必须是完整语义化版本(如"8.1.10"),不能只写"8.1",否则部分包会误判兼容性 - 扩展版本号建议和 PHP 小版本一致(如 PHP 8.1.10 →
ext-mbstring也写"8.1.10"),避免因扩展版本推导出错 - 该配置只影响
composer update时的依赖解析,不影响composer install对 lock 文件的校验
用命令行临时设置 platform 更适合 CI 或调试
命令行方式绕过编辑文件、不污染 composer.json,特别适合 CI 流水线中为不同目标环境生成 lock 文件。
例如,在 GitHub Actions 中为 PHP 8.1 环境生成兼容 lock:
composer update --no-interaction --with-all-dependencies --platform=php:8.1.10 --platform=ext-gd:8.1.10
-
--platform=php:X.Y.Z和--platform=ext-xxx:V可多次使用,优先级高于composer.json中的config.platform -
--platform在install和update阶段都生效;而config.platform仅在update时参与解析 - 若同时用了
--platform和config.platform,前者完全覆盖后者
config.platform 不是运行时检测,也不会屏蔽语法或扩展缺失
设了 "php": "8.1.10",不代表你本地 PHP 7.4 就能跑起来——它只让 Composer “假装”当前是 8.1.10 来选包,不改实际执行环境。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
典型翻车场景:
- 本地 PHP 8.2,
config.platform.php设为"8.1.10",装了 Laravel 10,但代码用了readonly属性 → 运行时报ParseError: unexpected token "readonly" - 本地没装
ext-posix,却在config.platform里声明了它 →composer install成功,但运行时调用posix_getpid()直接Fatal error - 以为加了
ext-curl就能用,结果只是跳过了依赖检查,实际 curl 扩展根本没启用(php -m里看不到)
本质:它只管“能不能选到包”,不管“包装完能不能跑”。真正决定运行能力的是你本地 PHP 版本、已加载扩展、以及 ini 配置是否启用。
跨平台构建别只靠 config.platform,得配合 Docker 或 --platform 参数
想在 macOS M1 上为 Linux ARM64 构建部署包?单靠 config.platform 不够。它没法模拟 OS 类型或架构,只能伪造 PHP 和扩展版本。
比如你写了 "ext-sodium": "8.2.12",Composer 不知道这是 Linux 还是 Windows 下的 sodium,更不会帮你下载对应平台的二进制。
- 含原生二进制的包(如
spatie/browsershot、laravel/pail)通常靠PHP_OS_FAMILY和PHP_ARCH决定下载行为 —— 这些是 PHP 运行时变量,config.platform完全不碰 - 真正可靠的跨平台构建方式是:在目标环境镜像里运行
composer install,例如:docker run --rm -v $(pwd):/app -w /app composer:2.7 install --no-dev
- 如果必须本地构建,优先用
--platform命令行参数 + 显式声明所有目标环境扩展版本,再手动验证关键二进制是否存在
最易被忽略的一点:config.platform 生效的前提是你本地 PHP 版本 ≥ 它所声明的版本。如果你本地是 PHP 7.4,却设 "php": "8.1.10",Composer 会直接报错退出,连“假装”的机会都不给。










