composer脚本中需用shell_exec调用git命令获取分支名、commit信息等,如git rev-parse –abbrev-ref HEAD,并写入VERSION.json;须确保环境有Git且在仓库根目录,加容错处理。

在 Composer 脚本中直接获取 Git 分支名或 commit 信息,不能靠 Composer 自身提供,得借助系统命令(如 git)在脚本执行时动态读取。关键在于确保运行环境有 Git 可用,且项目是 Git 仓库。
使用 exec 在脚本中调用 Git 命令
Composer 的 scripts 支持 shell 命令,可用 exec() 或 shell_exec() 执行 Git 命令并捕获输出。推荐在自定义 php 脚本中操作,更可控:
- 获取当前分支名:
git rev-parse --abbrev-ref HEAD - 获取完整 commit hash:
git rev-parse HEAD - 获取短 commit hash:
git rev-parse --short HEAD - 检查是否干净工作区:
git status --porcelain(输出为空表示干净)
在 composer.json 中定义脚本并调用 PHP 处理器
先在 composer.json 里注册一个脚本,指向你的 PHP 文件:
"scripts": { "post-install-cmd": [ "MyBuildScript::injectGitInfo" ] }
然后创建 MyBuildScript.php(确保自动加载或 require 进来),内容类似:
class MyBuildScript { public static function injectGitInfo($event) { $branch = trim(@shell_exec('git rev-parse --abbrev-ref HEAD 2>/dev/NULL')); $commit = trim(@shell_exec('git rev-parse --short HEAD 2>/dev/null')); $dirty = !empty(trim(@shell_exec('git status --porcelain 2>/dev/null'))); $info = [ 'branch' => $branch ?: 'unknown', 'commit' => $commit ?: 'unknown', 'dirty' => $dirty, ]; file_put_contents('VERSION.json', json_encode($info, JSON_PRETTY_PRINT)); } }
注意权限与环境限制
某些部署环境(如 CI/CD 的精简镜像、docker 容器)可能没装 Git,或工作目录不是 Git 仓库根目录:
- 加
2>/dev/null避免错误输出干扰 - 用
@shell_exec抑制警告(但建议先判断git --version是否可用) - 确保脚本在项目根目录运行(Composer 默认满足,但自定义命令需留意
getcwd()) - 若用于生产构建,建议把 Git 信息写入文件或常量,避免运行时依赖
替代方案:构建前生成静态元数据
更健壮的做法是在 CI 流程中提前生成版本信息(如用 git describe),再注入到 Composer 构建上下文:
- CI 脚本中运行:
echo "app_VERSION=$(git describe --tags --always --dirty)" >> .env - PHP 中用
$_ENV或getenv()读取,不依赖运行时 Git - 或生成
build-info.php,被项目直接require
基本上就这些。核心是别指望 Composer 内置 Git 支持,老老实实用 shell 命令,加好容错就行。
以上就是如何在 Composer 脚本中获取当前的分支名或 Git commit 信息?的详细内容,更多请关注php中文网其它相关文章!