Псевдоверсия - это специально отформатированная предварительная версия, которая кодирует информацию о конкретной ревизии в репозитории управления версиями. Например, v0.0.0-20191109021931-daa7c04131f5 - это псевдоверсия.
Псевдоверсии могут относиться к ревизиям, для которых не доступны семантические теги версии. Их можно использовать для тестирования коммитов перед созданием тегов версий, например, в ветке разработки.
Каждая псевдоверсия состоит из трех частей:
- Префикс базовой версии (vX.0.0 или vX.Y.Z-0), который является производным от тега семантической версии, предшествующего ревизии, или vX.0.0, если такой тег отсутствует.
- Отметка времени (ггггммддччммсс), которая представляет собой время создания ревизии в формате UTC. В Git это время коммита, а не время автора.
- Идентификатор ревизии (abcdefabcdef), который представляет собой 12-символьный префикс хэша коммита, или в Subversion, номер ревизии, дополненный нулями.
Каждая псевдоверсия может быть в одной из трех форм, в зависимости от базовой версии. Эти формы гарантируют, что псевдоверсия сравнивается выше, чем ее базовая версия, но ниже, чем следующая версия с тегами.
- vX.0.0-yyyymmddhhmmss-abcdefabcdef используется, когда нет известной базовой версии. Как и все версии, основная версия X должна соответствовать суффиксу основной версии модуля.
- vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef используется, когда базовая версия является предварительной версией, например vX.Y.Z-pre.
- vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef используется, когда базовая версия является версией релиза, например vX.Y.Z. Например, если базовая версия - v1.2.3, псевдо-версия может быть v1.2.4-0.20191109021931-daa7c04131f5.
Несколько псевдоверсий могут ссылаться на один и тот же коммит с использованием разных базовых версий. Это происходит естественно, когда более низкая версия помечается после написания псевдоверсии.
Эти формы придают псевдоверсиям два полезных свойства:
- Псевдоверсии с известными базовыми версиями сортируются выше, чем эти версии, но ниже, чем другие предварительные версии для более поздних версий.
- Псевдоверсии с одинаковым префиксом базовой версии сортируются в хронологическом порядке.
Команда go выполняет несколько проверок, чтобы убедиться, что авторы модуля имеют контроль над тем, как псевдоверсии сравниваются с другими версиями, и что псевдоверсии относятся к ревизиям, которые фактически являются частью истории коммитов модуля.
- Если указана базовая версия, должен быть соответствующий тег семантической версии, являющийся предком ревизии, описанной псевдоверсией. Это не позволяет разработчикам обойти выбор минимальной версии с помощью псевдоверсии, которая сравнивает более высокую, чем все версии с тегами, например v1.999.999-99999999999999-daa7c04131f5.
- Отметка времени должна соответствовать отметке времени ревизии. Это не позволяет злоумышленникам переполнять прокси-серверы модулей неограниченным количеством идентичных псевдоверсий. Это также не позволяет потребителям модулей изменять относительный порядок версий.
- Ревизия должна быть предком одной из ветвей или тегов репозитория модулей. Это не позволяет злоумышленникам ссылаться на неутвержденные изменения или пулл-запросы (pull requests).
Псевдоверсии никогда не нужно набирать вручную. Многие команды принимают хэш коммита или имя ветки и автоматически переводят его в псевдоверсию (или версию с тегами, если она доступна). Например:
go get -d example.com/mod@master
go list -m -json example.com/mod@abcd1234
Читайте также:
Комментариев нет:
Отправить комментарий