从某个软件包中确定Composer软件包的当前安装版本

时间:2019-04-16 02:07:13

标签: php git composer-php

说,我有一个有人安装的软件包。现在,我想制作一个调试报告,其中将确切显示当前安装的版本。

我本可以调查.git并获取最后一个标签:

git describe --tags --dirty=-dev --always

但是默认情况下,这不能作为Composer来从不包含.git--prefer-dist is set by default)的存档中安装软件包。而且不能可靠地强迫用户使用--prefer-source安装,这并不是很有意义。

如何获取当前安装的软件包版本?我可以不用探究composer show ...的输出,甚至根本不需要运行任何外部命令就能得到它吗?

1 个答案:

答案 0 :(得分:0)

解决此问题的一种方法是use export-subst for a file,说src/Version.php,然后添加以下常量:

const VERSION_INFO = '$Format:%h%d$';

并告诉Git替换此文件中的占位符:

$ grep export-subst .gitattributes
/src/Version.php        export-subst

然后,在导出时,将如以下示例中一样替换此常量:

$ git tag -m "Releasing v1.0.1" -a v1.0.1
$ git archive v1.0.1 | grep -a VERSION_INFO
    const VERSION_INFO = '12abc34 (HEAD -> master, tag: v1.0.1)';

接下来,您可以检查self::VERSION_INFO是否以美元符号开头,以及是否使用简单的正则表达式来解析版本和提交ID,例如:

class Version
{
    const VERSION_INFO = '12abc34 (HEAD -> master, tag: v1.0.1)';

    static function getVersion(): string
    {
        if (self::VERSION_INFO[0] === '$') {
            // get a version from Git (--git-dir may be of use here)
            return exec('git describe --tags --dirty=-dev --always');
        }

        if (preg_match('/^([0-9a-f]+).*?tag: (v?[\d\.]+)/', self::VERSION_INFO, $matched)) {
            return "{$matched[2]}-{$matched[1]}";
        }

        // cannot parse: return version string as is (fallback to other methods?)
        return self::VERSION_INFO;
    }
}

请注意,此版本字符串可能不包含分支名称:

git log --pretty=format:%h%d

(还有另一个选择是use Ocramius' PackageVersions,但是可能未安装此软件包。)