bin-compat 配置值只能是 "full" 或 "symlink",设为 "full_composer" 会报错或被忽略;"full" 生成带 autoload 的 PHP 脚本(Linux/macOS)或调用 composer.phar 的 .bat 文件(Windows),需正确使用 .bat 入口、确保 php 在 PATH 中且路径无空格,并通过 PHP_OS_FAMILY 实现脚本级跨平台兼容。

bin-compat 配置值只能是 "full" 或 "symlink",没有 "full_composer"
直接写 "bin-compat": "full_composer" 会触发 Composer 报错(新版)或静默忽略(旧版),因为源码里只接受 "full" 和 "symlink" 两个字符串。所谓“带完整 Composer 运行时”的脚本,就是 bin-compat 设为 "full" 后生成的:Linux/macOS 下是带 autoload 加载逻辑的 PHP 脚本,Windows 下是调用 composer.phar 的 .bat 文件。
常见错误现象:
-
vendor\bin\phpunit.bat双击报'php' is not recognized - 执行
vendor\bin\phpunit(无扩展名)失败,而vendor\bin\phpunit.bat才是 Windows 正确入口 -
bin-dir路径含空格(如"bin-dir": "my tools"),导致.bat生成语法错误(was unexpected at this time)
设了 bin-compat="full" 却仍执行失败?先检查三件事
bin-compat="full" 只控制包装器生成方式,不改写脚本内部逻辑。失败往往出在运行时环境或脚本自身。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Windows 下确认
php命令已加入 PATH,且路径不含空格(如C:\Program Files\php会导致.bat中硬编码调用失败) - 必须执行
vendor\bin\xxx.bat,而不是vendor\bin\xxx;CMD/PowerShell 默认不识别无扩展名文件 - Git Bash / WSL 不解析
.bat,此时应设"bin-compat": "symlink"并在 Linux 环境下用vendor/bin/xxx - 脚本内禁用
shell_exec('grep')、exec('rm -rf')等 POSIX-only 命令,改用 PHP 原生函数(如file_get_contents()+str_contains())
真正跨平台的 bin 脚本必须自己判断系统
Composer 的 bin 字段只负责复制或链接文件,不做任何平台判断。跨平台逻辑必须由脚本自身实现。
- 入口必须是 PHP 脚本(推荐
.php后缀),开头带#!/usr/bin/env php - 用
PHP_OS_FAMILY判断系统,再分发调用:exec('mytool-linux')、exec('mytool-win.exe')或exec('php mytool.phar') - 避免写死路径如
/tmp或C:\temp,统一用sys_get_temp_dir() - 平台相关二进制(如 Chromium、wkhtmltopdf)建议放
resources/下,由post-install-cmd根据系统下载或软链,而非塞进bin/
config.platform 是长期适配的核心,不是临时补丁
--ignore-platform-reqs 只跳过安装校验,不解决运行时兼容问题。真正影响执行的是依赖解析阶段是否排除了不兼容包。
- 在
composer.json中配置"platform",让 Composer 在update时假装运行在目标环境上 - 例如部署到 PHP 8.1 + opcache 的 CentOS,就设
"php": "8.1.25"和"ext-opcache": "8.1.25" - 改完
config.platform后,必须运行composer update --lock(或删掉composer.lock后重update),否则install仍按旧 lock 文件还原 - 注意:某些包硬编码了扩展加载逻辑(如
extension=apcu.so),platform无法绕过这类运行时错误
跨平台 bin 兼容最难的不是配置,而是脚本里那些没被 PHP_OS_FAMILY 包裹的 shell 命令、路径拼接和临时目录写法——它们不会报错,直到第一次在另一平台运行才暴露。

















