composer 不支持直接安装 .phar 文件,因其仅处理 packagist 注册的含 composer.json 的 php 包;.phar 是构建产物,无版本管理与自动加载机制。正确方式为手动下载、授权并放入系统路径,或用 humbug/box 打包。

为什么不能用 composer require xxx.phar
直接写 composer require php-cs-fixer.phar 会报错:Could not find a matching version of package php-cs-fixer.phar。这不是你拼错了,是 Composer 根本不认 .phar 后缀——它只处理 Packagist 上注册的、带 composer.json 的 PHP 包。.phar 是构建产物,不是包,也没有版本约束、依赖解析或自动加载机制。
常见错误现象:看到别人说“用 Composer 安装 PHAR 工具”,就去搜 .phar 名字,结果全失败。本质混淆了「分发方式」和「安装方式」。
- Composer 分发 CLI 工具,靠的是发布一个含
"bin"字段的包(如phpstan/phpstan),不是靠打包成 PHAR - 你执行
composer global require phpstan/phpstan,实际下载的是源码 zip,bin里声明的脚本被软链到~/.composer/vendor/bin/,和 PHAR 无关 - 工具作者内部是否用 PHAR 打包入口,对你透明;你只管执行命令,Composer 自动处理 autoload 和路径注册
只有独立 .phar 文件时,该怎么做
如果你拿到的是现成的 php-cs-fixer.phar 或 box.phar,别碰 Composer —— 它帮不上忙,还可能误导你去配仓库或改配置。
正确做法就是传统 Unix 风格:下载、授权、放路径。
- 下载:
curl -Lo php-cs-fixer.phar https://cs.symfony.com/download/php-cs-fixer-v3.phar - 加执行权限:
chmod +x php-cs-fixer.phar - 移到系统可执行路径,比如:
sudo mv php-cs-fixer.phar /usr/local/bin/php-cs-fixer - 验证:
php-cs-fixer --version(注意这里没写php前缀,因为文件已有 shebang)
Windows 用户注意:.phar 不是原生可执行文件,双击必失败;必须用 php php-cs-fixer.phar --version 显式调用解释器,或在批处理中写死 php "%~dp0php-cs-fixer.phar"。
想自己把项目打包成 PHAR,用 humbug/box 而不是 Composer
Composer 不参与构建过程。真正干活的是 box:它读 box.json,扫描源码,合并 vendor,生成 stub,压缩签名——全程绕过 Composer 的依赖管理逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关键配置点都在 box.json 里,不是 composer.json:
-
"main": "bin/myapp":必须指向带#!/usr/bin/env php的可执行入口,不能是纯.php文件 -
"install": false:强制关闭 Box 自动运行composer install,否则它会把require-dev也打进 PHAR -
"exclude-composer-files": true:删掉composer.lock和元数据,减小体积 - 打包前手动运行:
composer install --no-dev --optimize-autoloader,再删掉vendor/composer/autoload_dev.php
执行:box compile。输出的 myapp.phar 是完整自包含二进制,不依赖宿主机的 vendor 或 composer.json。
PHAR 运行时报 Class not found 怎么查
不是类没打进包,而是 autoloader 混了 dev 和 prod 路径。Box 默认会加载 vendor/autoload.php,但如果这个文件里还注册了 autoload-dev,而对应文件又被排除了,就会映射失效。
最直接的验证方式:
- 解包检查:
php -d phar.readonly=0 -r '$p = new Phar("myapp.phar"); foreach ($p as $f) { echo $f->getFileName()."\n"; }' - 确认
vendor/composer/autoload_dev.php不存在 - 确认
vendor/autoload.php里没有require __DIR__.'/autoload_dev.php'这类语句 - 运行时加
-d display_errors=1看完整报错路径:php -d display_errors=1 myapp.phar --version
最容易被忽略的是:box compile 前没清干净 autoload_dev.php,或者 box.json 里漏写了 "install": false,导致 Box 自己又跑了一次 composer install,把 dev 依赖重新拉回来了。










