понедельник, 25 января 2021 г.

Модули в Golang: псевдоверсии

Псевдоверсия - это специально отформатированная предварительная версия, которая кодирует информацию о конкретной ревизии в репозитории управления версиями. Например, 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


Читайте также:


Комментариев нет:

Отправить комментарий