platform-check 不阻止跨平台部署但强制 install 阶段校验真实环境,导致 windows 因缺失 ext-posix 报错;关掉需用 "platform-check": false 或 --ignore-platform-req=ext-posix,但运行时仍需兼容处理。

platform-check 配置本身不阻止跨平台部署,但它会强制 Composer 在 install 阶段校验本地真实环境是否满足 require 中声明的扩展或 PHP 版本——这正是跨平台失败的直接原因。
为什么 platform-check 会在 Windows 上报 ext-posix 缺失
只要某个包(比如旧版 symfony/console)在 require 里写了 "ext-posix": "*",而你又没关掉 platform-check,Composer 就会在 install 时检查当前系统能否加载该扩展。Windows 没 ext-posix,php -m 里压根没有这一行,所以报错:Your requirements could not be resolved to an installable set of packages. ext-posix is missing from your system.
- 这不是 bug,是设计行为:Composer 把
require当作硬性契约,不是“建议” -
config.platform对install阶段完全无效——它只影响update时的依赖解析 - 哪怕你在
composer.json里写了"config": { "platform": { "ext-posix": true } },install还是会查真实环境
关闭 platform-check 的正确姿势
想让 install 跳过这个检查,必须显式关掉,但要注意作用范围:
- 全局关(不推荐):
composer global config platform-check false→ 所有项目都失效,CI 容易出问题 - 项目级关(推荐):在当前项目的
composer.json的config段加"platform-check": false - 命令行临时关(调试用):
composer install --ignore-platform-reqs或更精准地composer install --ignore-platform-req=ext-posix
注意:--ignore-platform-reqs 会跳过所有检查(PHP 版本、扩展、lib 等),而 --ignore-platform-req=xxx 只跳过指定项,后者更安全。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关了 platform-check 之后,运行时还可能崩
关掉检查只是让依赖装得下去,不代表代码能跑起来。如果代码里直接调用了 posix_getpid(),而 Windows 没这个函数,照样 fatal error。
- 真正兼容的做法是运行时判断:
if (function_exists('posix_getpid')) { ... } - 或者把带
ext-posix依赖的包挪到require-dev,仅开发时用 -
platform-check: false不改变config.platform的模拟行为——它仍会影响update时的依赖选择
跨平台部署真正要盯住的三个环节
很多人以为关了 platform-check 就万事大吉,其实还有两个隐形坑:
-
composer.lock是在哪个平台生成的?如果是在 Linux 上update出来的,里面可能锁了只在 Linux 下构建的二进制(比如spatie/browsershot的 Chromium 二进制) -
vendor/bin下的脚本:Windows 默认不认.sh,也不自动执行.bat,除非你设了"bin-compat": "full"且确认路径不含空格/中文 - 路径拼接:用
__DIR__ . '\src'在 Windows 下可能被 WSL 或 CI 挂载路径污染,统一用/或realpath()包一层
platform-check 只是第一道门;门开了,后面还得一一手动验。










