不能。bin-compat=full_composer仅控制vendor/bin下脚本包装器生成(windows建.bat/.cmd,linux/macos建shell脚本),不解决路径分隔符、换行符、shell命令差异或php代码兼容性问题。

composer.json 里 bin-compat 设成 full_composer 真的能跨平台?
不能。这是个常见误解:bin-compat 是 Composer 自身的内部配置项,只影响 vendor/bin/ 下可执行脚本的生成方式,和 windows/Linux 兼容性无直接关系。它不改变 PHP 代码行为,也不解决路径分隔符、换行符或 shell 命令差异问题。
为什么设了 full_composer 还是跑不起来?
因为 full_composer 模式只是让 Composer 在 Windows 上也生成 .bat 和 .cmd 包装器(Linux/macOS 则生成 shell 脚本),但前提是:这些包装器调用的底层命令本身得能在目标系统运行。比如:
- 你的
bin脚本里写了#!/usr/bin/env php—— Windows 不认这行,但.bat包装器会绕过它;可如果脚本里又硬编码了sed或grep,那在 Windows(没安装 git bash / WSL)下照样失败 -
full_composer不修复__DIR__ . '/../../vendor/autoload.php'这类路径拼接在 Windows 下变成反斜杠导致 require 失败的问题 —— 这得靠dirname(__FILE__)或__DIR__配合str_replace('', '/', ...)或直接用realpath()
真正影响跨平台的关键配置和写法
Composer 的 bin-compat 只是表象,实际要关注三处:
-
bin-dir在composer.json中建议显式设为"bin-dir": "bin"(而非默认vendor/bin),避免某些 CI 工具因路径含vendor而误判 - 所有自定义
bin脚本必须以#!/usr/bin/env php开头,且保存为 LF 换行(Git 提前配core.autocrlf=input) - PHP 代码中禁止用
exec('ls')、shell_exec('rm -rf')这类 POSIX-only 命令;改用scandir()、RecursiveDirectoryIterator等原生函数 - 路径拼接统一用
dirname(__DIR__) . DIRECTORY_SEPARATOR . 'src',别手写/或
验证是否真兼容:别只看 vendor/bin 下有没有 .bat
光看文件生成没用,得实测执行流:
- 在干净 Windows 环境(无 WSL、无 Git Bash)下运行
php bin/mytool(不是mytool.bat),确认它能启动 - 检查脚本里所有
require、include路径是否都通过realpath()或__DIR__+DIRECTORY_SEPARATOR构建 - CI 流水线里同时跑
phpunit和你自己的bin工具,Windows 和 Linux job 都 green 才算过关
跨端真正的难点从来不在 bin-compat 选哪个值,而在于整个工具链是否彻底回避了操作系统假设 —— 连 sys_get_temp_dir() 返回的路径里带空格都要处理,这才是容易被跳过的细节。