说,我有一个有人安装的软件包。现在,我想制作一个调试报告,其中将确切显示当前安装的版本。
我本可以调查.git
并获取最后一个标签:
git describe --tags --dirty=-dev --always
但是默认情况下,这不能作为Composer来从不包含.git
(--prefer-dist
is set by default)的存档中安装软件包。而且不能可靠地强迫用户使用--prefer-source
安装,这并不是很有意义。
如何获取当前安装的软件包版本?我可以不用探究composer show ...
的输出,甚至根本不需要运行任何外部命令就能得到它吗?
答案 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,但是可能未安装此软件包。)