Composer——一个包可以获得自己的版本吗


Composer -- can a package get its own version

我正在用Composer分发一个PHP包。Composer版本通过其git标记进行打包。

我希望我的包在发出HTTP请求时使用的用户代理字符串中发送其版本号。

我的软件包作为另一个软件包的依赖项安装后,是否有可能获得自己当前安装的版本号,假设该版本号在源代码中没有硬编码?

当有问题的包是根包时,我可以通过包后安装/包后更新脚本在安装/更新时获得版本号。一个事件被传递给我可以从中获得当前安装的版本:

public static function write('Composer'Script'CommandEvent $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修订。