Интересно и не очень понятно, как это реализовано где-либо, в частности, в Gentoo Portage и DPKG.
Вступление.
Если у нас версии ПО имеют вид, например, 10.11, 12.13.14, 15.16.17.18 - всё легко и просто, можем работать с ними, как со строками, где символы - числа, разделённые точками, и сортировать как-бы лексикографически. А сортировать нам нужно, чтобы узнать, какую версию выбрать, как самую свежую из доступных. Ну и уметь просто сравнить нужно, чтобы узнать, доступно ли повышение версии.
Встречается такая вариация: 10.11.12-13, а ещё в deb-пакетах (не вникал, зачем) фигурирует первое число с двоеточием: 10:11.12.13-14. Допустим, мы можем все эти разделители (:, -) заменить на точки и работать по предыдущей схеме.
Но ещё есть такая фигня, как release candidate, обычно версия записывается как 10.11-rc12. При этом, по задумке, версия 10.11 будет _выше_, чем 10.11-rc12, и вот тут в голове у нас что-то больно хрустит.
А ещё в deb-пакетах часто строка версии просто отвал башки:
zlib1g 1:1.2.3.4.dfsg-3ubuntu4
xz-lzma 5.1.1alpha+20110809-3
xkb-data 2.5-1ubuntu1.3
vim 2:7.3.429-2ubuntu2.1
ucf 3.0025+nmu2ubuntu1
tzdata 2014e-0ubuntu0.12.04
sysv-rc 2.88dsf-13.10ubuntu11.1
ntfs-3g 1:2012.1.15AR.1-1ubuntu1.2
login 1:4.1.4.2+svn3283-3ubuntu5.1
librtmp0 2.4~20110711.gitc28f1bab-1
libroken18-heimdal 1.6~git20120311.dfsg.1-2
Вопросы:
1. Я продвигал rc-версии своих пакетов в Portage Tree, например. Не ломает ли запись типа 1.2.3-rc4 механизма сравнения там?
2. Сейчас я поддерживаю ПО, которое пакетится (и пакетилось ранее) в deb-дистрибутивы с версиями типа 1:2.3.4-5 в пакетах, для человеков анонсированная версия озвучивается как 2.3.4 или 2.3.4-5. Часть после дефиса наращивается в случае исправлений пакетирования. Я понимаю, что 4 числа многовато и можно одно выкинуть, когда-нибудь этим займёмся. Тэги Git тоже держим в формате v2.3.4-5. Какова необходимость именно в части после дефиса для deb-пакетов, правильно ли это согласно политик deb-пакетирования, и насколько стрёмно использовать эту часть в случае дистрибуции пакетов на другие пакетные системы?
3. Какие общие best practices в плане версионирования, чтобы не страдать экзотичностью и избегать потенциальных проблем? Если придерживаться формата 1.2.3[.4], то, по идее, никаких проблем быть не должно. Но вот ядро использует rc, насколько хорошо системы пакетов обрабатывают эти случаи?