Одним из способов решения этой проблемы является использование export-subst
для файла , скажем 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
со знака доллара, а если нет - проанализировать версию и идентификатор фиксации с помощью простого регулярного выражения, например:
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
(Еще один вариант - использовать пакетные версии Ocramius , но этот пакет может быть не установлен.)