我正在用Composer分发一个PHP包。Composer版本通过其git标记进行打包。
我希望我的包在发出HTTP请求时使用的用户代理字符串中发送其版本号。
我的软件包作为另一个软件包的依赖项安装后,是否有可能获得自己当前安装的版本号,假设该版本号在源代码中没有硬编码?
当有问题的包是根包时,我可以通过包后安装/包后更新脚本在安装/更新时获得版本号。一个事件被传递给我可以从中获得当前安装的版本:
public static function write(ComposerScriptCommandEvent $event)
{
$composer = $event->getComposer();
$localRepository = $composer->getRepositoryManager()->getLocalRepository();
$package = $composer->getPackage($localRepository, 'my/package-name', null);
file_put_contents(__DIR__ . '/../version', $package->getVersion());
}
然而,出于安全原因,在安装/更新父包时,依赖关系的脚本不会运行,因此这不会发生。
一个可能的行是运行composer show -i my/package-name
并解析出版本号,但这不是很容易移植。(PHP可执行文件在哪里?composer.phar文件在哪里等)
另一种可能是将Composer本身作为一个依赖项,并使用上面代码示例中的一些自己的逻辑。但是,将Composer本身作为一个依赖项来包含是一个很大的膨胀。
我在Composer自己的源代码中看到,它将自己的版本指定为'@package_version@'
,但据我所知,这只适用于Composer本身,当Composer将自己编译为phar文件时,它会被替换为版本号。
我可以解析根包中composer.lock文件的版本号。这看起来很混乱,但我想这就是我现在要做的。
还有其他解决方案吗?我感觉我错过了一些非常简单的东西。
您可以执行以下操作https://github.com/mcuelenaere/composer-revision-plugin:这会在构建时生成一个PHP类,其中包含所有composer依赖项的git修订。