composer 的 platform-config 仅模拟目标环境的 php/扩展版本,不支持按操作系统条件安装;os 特定依赖应通过 require-dev 结合 scripts 和 php_os_family 判断实现。

Composer 的 platform-config 如何影响条件安装
Composer 本身不支持“按操作系统自动切换依赖”,platform 配置只是用来**模拟目标环境的 PHP/扩展版本**,用于解决本地开发与生产环境不一致导致的依赖解析失败问题。它不会触发条件安装逻辑,也不会让 require 中的包只在 Windows 或 Linux 下生效。
用 require-dev + 脚本钩子实现 OS 特定工具安装
真正可行的做法是:把 OS 专属工具(如 Windows 下的 phpunit/phpunit 替代品、Linux/macOS 下的 psysh 或 composer/composer CLI 工具)放进 require-dev,再配合 scripts 在 post-install-cmd/post-update-cmd 中判断系统并执行对应操作。
-
PHP_OS_FAMILY是 PHP 7.2+ 提供的可靠常量,返回Windows/Linux/Darwin,比PHP_OS更干净 - 脚本中不要直接写
exec('apt install ...')这类系统命令——Composer 不保证运行环境有 sudo 权限或包管理器可用 - 推荐方式:用
if (PHP_OS_FAMILY === 'Windows') { require_once 'vendor/bin/some-win-tool'; }把逻辑收进 PHP 脚本里,由用户自行决定是否启用
为什么不能用 conflict 或 provide 做 OS 限制
conflict 只能阻止某些包共存,provide 是声明“我实现了某个虚拟包”,二者都**不参与平台判定**。你写 "conflict": {"php": "os=windows"} 是无效语法,Composer 解析会直接报错:Invalid package information。
本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
试图用 platform 伪造一个不存在的 OS 标识(比如 "php": "8.2.0-os=win")也行不通——Composer 的 platform 仅识别 php、ext-*、lib-* 这三类,且值必须是合法版本号格式。
实际可落地的最小方案
假设你要在 Windows 下安装 symfony/console 作为本地调试命令,在 Linux 下则用 wp-cli/wp-cli(WordPress CLI),但两者不能同时存在:
{
"require-dev": {
"symfony/console": "^6.4",
"wp-cli/wp-cli": "^2.9"
},
"scripts": {
"post-install-cmd": [
"@php -r "if (PHP_OS_FAMILY === 'Windows') { echo 'Using Symfony Console\n'; } else { echo 'Using WP-CLI\n'; }""
]
}
}
注意:这里只是示例输出提示,真要隔离加载,得靠应用层代码判断 PHP_OS_FAMILY 后动态 require 对应的 bin 文件,或者用 PSR-4 自动加载规则把 OS 相关命令分目录存放。Composer 不负责运行时加载控制,这点容易被忽略。










