composer scripts不支持条件判断,因其仅原样传递字符串给系统shell;linux/macos用/bin/sh -c,windows用cmd /c,语法不兼容;可靠方案是用php脚本中转或platform配置兜底。

不支持。Composer 的 scripts 字段本身是纯 JSON 配置,没有 if/else、变量或运行时条件解析能力——它只负责把字符串或数组“原样交给系统 shell 或 PHP 执行器”。所有条件逻辑必须下放到外部命令层。
为什么直接写 && 或 [ "$OSTYPE" = "linux-gnu" ] 会失败
因为 Composer 不统一执行环境:Linux/macOS 调用 /bin/sh -c "your-command",Windows 默认走 cmd /c "your-command"。这两者对语法的支持完全不同:
-
cmd不认识[命令,[ "$OSTYPE" = "linux-gnu" ] && echo ok在 Windows 上直接报“找不到程序” -
&&在cmd中不是短路操作符,而是被当作文本的一部分;command1 && command2整体被视为一个命令名 - 不同 shell 对引号、空格、重定向的解析规则差异极大,同一行脚本在 Git Bash、PowerShell、CMD 下行为可能完全不同
真正可用的跨平台条件判断方案
只有两类落地路径,其他都是伪方案:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用独立 PHP 脚本中转:在
scripts/composer-condition.php里用PHP_OS_FAMILY或php_uname('s')判断,再调用对应命令。Composer 只需配置"post-install-cmd": "php scripts/composer-condition.php" - 用
config.platform+ 环境变量兜底:仅适用于 CI 场景(如 GitHub Actions 强制设"platform": {"php": "8.2.0", "ext-redis": "8.0"}),但实际运行仍以宿主机为准,不能用于动态决策
别指望 composer.json 里写条件——它不是模板引擎,JSON 解析器根本不会执行任何逻辑。
PHP 脚本里怎么安全加载项目类并做判断
Composer 执行脚本时默认不引入自动加载,所以不能直接 new 类或调用命名空间函数。必须手动加载:
- 第一行加
require __DIR__ . '/../vendor/autoload.php';(假设脚本在scripts/目录) - 别用
include 'vendor/autoload.php'——执行路径不同会导致路径失效 - 检查是否加载成功:
if (!class_exists('Composer\Autoload\ClassLoader')) { die('autoload not loaded'); } - 参数要靠
$_SERVER['COMPOSER_ARGS']拿(Composer 4.0+ 提供),而不是$argv;调用时必须用composer run-script check-env -- --os=linux,漏掉--分隔符参数就丢了
最易被忽略的一点:所有条件分支最终都要映射到可执行命令上,而这些命令本身(比如 find、sed、dir)在不同系统行为不一致。所以真正的跨平台健壮性,不在 Composer 配置里,而在你调用的每个底层命令是否做了兼容处理。










