Определите текущую установленную версию пакета Composer из этого пакета - PullRequest
0 голосов
/ 16 апреля 2019

Скажите, у меня есть пакет, который кто-то установил. Теперь я хочу сделать отчет об отладке, в котором будет указано, какие именно версии установлены в данный момент.

Я мог бы заглянуть в .git и получить последний тег:

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

Но это не будет работать, так как Composer по умолчанию устанавливает пакеты из архивов, которые не содержат .git (--prefer-dist установлено по умолчанию ). И никто не может надежно заставить пользователей устанавливать с --prefer-source, и это не так, как это имеет большой смысл.

Как получить версию пакета, установленную в данный момент? Могу ли я получить его, не изучая вывод composer show ... или даже вообще не выполняя никаких внешних команд?

1 Ответ

0 голосов
/ 16 апреля 2019

Одним из способов решения этой проблемы является использование 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 , но этот пакет может быть не установлен.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...