やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

バージョニングについて(PEPとsemver)

 リリース修飾子のところは差異がある。

参考

各種バージョニング書式

[N!]N(.N)*[{a|b|rc}N][.postN][.devN]
N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]
^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$

分析

 リリース修飾子が異なる。alpha,beta,rcなど。echo -e '0.9\n0.10' | sort -Vr

semver

0.0.1-alpha.1

pep

0.0.1a1

 リリース修飾子があると期待どおりにならない。

echo -e '0.9\n0.10' | sort -Vr
echo -e '0.1\n0.9\n0.9.a\n0.9.a.9\n0.9.a.10\n0.10' | sort -Vr
echo -e '0.1\n0.9\n0.9a\n0.9a9\n0.9a10\n0.10' | sort -Vr
0.10
0.9.a.10
0.9.a.9
0.9.a
0.9
0.1
0.10
0.9a10
0.9a9
0.9a
0.9
0.1

 期待値は以下。アルファベットが含まれているものは古いものとしてほしい。

0.10
0.9
0.1
0.9.a
0.9.a.9
0.9.a.10

 この処理が難しそう。バージョニングの規格によって相当異なる。よって、N.N.Nのように数値だけにしたほうが無難。

簡単にできないか考えてみたがダメっぽい

 alphaなどのリリース修飾子を簡単にソートできる方法はないか考えてみた。

 アルファ版とかの前に数値いらなくない? 以下みたいにしたらダメなの?

alpha.0.0.1
beta.0.0.1
rc.0.0.1

 と思ったがダメ。

echo -e "0.1\na.0.1\n0.10\na.0.10\nb.0.1\nb.0.10" | sort -Vr
b.0.10
b.0.1
a.0.10
a.0.1
0.10
0.1

 ならalphabetaの後に数値つけるのをやめてみると?

echo -e "0.1\n0.1.a\n0.10\n0.10.a\n0.1.b\n0.10.b" | sort -Vr
0.10.b
0.10.a
0.10
0.1.b
0.1.a
0.1

 ダメだった。期待値は以下。

0.10
0.1
0.10.b
0.1.b
0.10.a
0.1.a
  1. アルファベットなしを最新とする
  2. アフファベット付きは辞書の逆順を最新とする
  3. アルファベット付きのものは同一アルファベットでグルーピングしてからソートする

 そんな複雑なことやってられない。

所感

 結局N.N.N形式にするのが無難。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux