如何在Composer包安装时自动构建未提交的vendor binary?
解决Composer依赖包自动构建Bin文件的方案
核心问题说明
你之前尝试的pre-install-cmd/post-install-cmd等钩子无效,是因为Composer默认仅执行根项目的脚本钩子,依赖包的这些钩子不会自动触发。要实现依赖包安装时自动构建Phar文件,有两种可行方案:
方案一:占位脚本触发构建(推荐,类似PHPUnit实现)
这种方式不需要依赖Composer钩子,在用户第一次调用命令时自动完成构建,兼容性最好:
- 创建占位执行脚本
在你的包的bin目录下创建foobar文件(无后缀,确保可执行),内容如下:
#!/usr/bin/env php <?php $pharPath = __DIR__ . '/foobar.phar'; // 检查Phar文件是否存在,不存在则执行构建 if (!file_exists($pharPath)) { chdir(__DIR__ . '/../'); // 切换到包根目录 passthru('php build.php --target=./bin/foobar.phar', $exitCode); if ($exitCode !== 0) { exit($exitCode); } } // 执行Phar文件 require $pharPath;
- 修改composer.json配置
将bin配置指向这个占位脚本,而非最终的Phar文件:
{ "bin": ["bin/foobar"], "scripts": { "build": "@php build.php --target=./bin/foobar.phar" } }
- 提交文件到仓库
将bin/foobar和build.php提交到仓库,不要提交foobar.phar。
当依赖项目安装你的包后,第一次执行vendor/bin/foobar时,脚本会自动构建Phar文件,之后直接调用已生成的Phar。
方案二:利用Composer自动加载钩子强制构建
这种方式会在依赖包安装/更新时自动构建Phar,但需要确保根项目未禁用依赖包脚本:
- 修改composer.json配置
在你的包的composer.json中添加post-autoload-dump钩子,绑定构建命令:
{ "bin": ["bin/foobar.phar"], "scripts": { "build": "@php build.php --target=./bin/foobar.phar", "post-autoload-dump": [ "@composer run-script build" ] } }
- 关键说明
post-autoload-dump事件会在Composer生成/更新自动加载文件时触发,依赖包的该脚本会被执行(前提是根项目未使用--no-scripts参数,且未限制依赖包脚本执行)。构建完成后,Composer会将生成的foobar.phar复制到根项目的vendor/bin目录。
注意事项
- 确保
build.php脚本能正确处理路径,避免因工作目录问题导致构建失败。 - 方案一无需依赖Composer钩子,对所有环境兼容性更好;方案二更贴近“安装时自动完成”的需求,但受根项目脚本配置影响。
内容的提问来源于stack exchange,提问作者Koala Yeung
相关产品推荐
相关产品推荐

