优先读取环境变量APP_VERSION,其次解析composer.json的version字段,最后 fallback 到默认值,确保PHP项目版本号可动态获取且清晰可追踪。

在使用 Composer 构建 PHP 项目时,有时需要在脚本中动态获取当前项目的版本号,比如用于日志记录、构建标识或部署信息。虽然 Composer 没有直接提供“获取根包版本”的内置命令,但它通过环境变量 COMPOSER_ROOT_VERSION 在特定场景下传递项目根包的版本信息。
COMPOSER_ROOT_VERSION 环境变量的作用
COMPOSER_ROOT_VERSION 是 Composer 在安装或更新依赖时识别根项目版本所使用的环境变量。它的主要用途是:
- 当
composer.json中的version字段未设置时,Composer 可以通过该环境变量得知当前项目的版本 - 在 CI/CD 或打包流程中,用于覆盖默认版本定义,实现动态版本控制
- 某些插件或自定义安装器会读取此变量来判断项目上下文
注意:这个变量 不会自动设置,需要手动在运行 Composer 命令前定义。
如何在脚本中获取项目根包版本
如果你希望在部署脚本、自定义命令或构建流程中获取项目版本,有以下几种实用方法:
-
优先读取 composer.json 中的 version 字段
最直接的方式是解析
composer.json文件:$data = json_decode(file_get_contents(__DIR__ . '/composer.json'), true); $version = $data['version'] ?? 'unknown';
-
利用 Composer 的 dump-autoload 生成版本常量
可在项目初始化时将版本写入一个 PHP 文件:
// build-version.php file_put_contents('Version.php', '配合 Composer 脚本自动执行:
"scripts": { "post-install-cmd": ["php build-version.php"], "post-update-cmd": ["php build-version.php"] } -
在 CI 环境中使用 COMPOSER_ROOT_VERSION
例如在 GitLab CI 中:
variables: COMPOSER_ROOT_VERSION: $CI_COMMIT_TAG
install: script:
- composer install --no-dev
这样即使
composer.json没有 version 字段,也能正确识别版本。
- composer install --no-dev
结合环境变量与代码的推荐做法
为了兼顾灵活性和可维护性,建议采用“优先级叠加”策略:
$version = getenv('APP_VERSION') ?:
(json_decode(file_get_contents('composer.json'), true)['version'] ?? 'dev');
- 先尝试从环境变量(如 APP_VERSION)读取 —— 适合容器化部署
- 再 fallback 到 composer.json 的 version 字段
- 最后使用默认值(如 dev)防止出错
基本上就这些。COMPOSER_ROOT_VERSION 主要服务于 Composer 自身的内部逻辑,而实际在应用中获取版本,更推荐通过文件解析或构建流程注入的方式实现。关键是保持版本来源清晰、可追踪。










