You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Composer包安装时自动构建未提交的vendor binary?

解决Composer依赖包自动构建Bin文件的方案

核心问题说明

你之前尝试的pre-install-cmd/post-install-cmd等钩子无效,是因为Composer默认仅执行根项目的脚本钩子,依赖包的这些钩子不会自动触发。要实现依赖包安装时自动构建Phar文件,有两种可行方案:


方案一:占位脚本触发构建(推荐,类似PHPUnit实现)

这种方式不需要依赖Composer钩子,在用户第一次调用命令时自动完成构建,兼容性最好:

  1. 创建占位执行脚本
    在你的包的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;
  1. 修改composer.json配置
    将bin配置指向这个占位脚本,而非最终的Phar文件:
{
  "bin": ["bin/foobar"],
  "scripts": {
    "build": "@php build.php --target=./bin/foobar.phar"
  }
}
  1. 提交文件到仓库
    将bin/foobar和build.php提交到仓库,不要提交foobar.phar。

当依赖项目安装你的包后,第一次执行vendor/bin/foobar时,脚本会自动构建Phar文件,之后直接调用已生成的Phar。


方案二:利用Composer自动加载钩子强制构建

这种方式会在依赖包安装/更新时自动构建Phar,但需要确保根项目未禁用依赖包脚本:

  1. 修改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"
    ]
  }
}
  1. 关键说明
    post-autoload-dump事件会在Composer生成/更新自动加载文件时触发,依赖包的该脚本会被执行(前提是根项目未使用--no-scripts参数,且未限制依赖包脚本执行)。构建完成后,Composer会将生成的foobar.phar复制到根项目的vendor/bin目录。

注意事项

  • 确保build.php脚本能正确处理路径,避免因工作目录问题导致构建失败。
  • 方案一无需依赖Composer钩子,对所有环境兼容性更好;方案二更贴近“安装时自动完成”的需求,但受根项目脚本配置影响。

内容的提问来源于stack exchange,提问作者Koala Yeung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:45:34