最近在網路上查了下 rpm 包的版本是如何比較的,發現這方面的資料比較少,尤其是中文的
這個問題對於發行版的開發人員比較重要,到底那個包比那個包新,版本控制,指定依賴關係等都需要用到的。
好了,廢話不多說。
版本號表示格式為 epoch:version-release,例如 1:2-3 通常情況下epoch不會顯示在rpm包的名字裡,可以通過下面的命令來檢視epoch的值。
$rpm -q ***.rpm --queryformat '%\n'
第一條原則是 rpm 屬性優先順序 epoch > version > release
兩個 rpm 包比較時,先看兩者的 epoch 哪個新,如果 epoch 相等,再看 version 哪個新,如果 version 還相等,最後看 release 哪個新,要是 release 也相等,那麼這兩個 rpm 包的版本是相等的。
0:1-2 > 0:1-1
0:2-1 > 0:1-3
1:1-1 > 0:2-2
第二條原則是版本號字段列表分隔模式
epoch 屬性之外,version 和 release 可能不單單包含數字,也可能含有字串,例如 1.0alpha1、2.0.0+svn12221
遇到這種情況時,版本號欄位會被分隔為列表。分隔策略是數字與字串分開,形成自然分隔邊界,點號/加號/減號/下劃線作為分隔符。1.0alpha1 會分為 [ 1、0、alpha、1 ],2.0.0+svn12221 會分為 [ 2、0、0、svn、12221 ]。這樣子分隔的目的是為了列表相應分段進行比較,比較的優先順序按照列表的下標順序自然排序,第一位的優先順序最高,後面依次降低。如果兩個列表可比較的分段經過比較後都相等,那麼列表長的比列表短的新,如果列表長度也一樣,那麼這兩個版本號字段相等。
1.2.0 > 1.1.9 ( [1,2,0] 中第2分段的「2」 > [1,1,9] 中第2分段的「1」 )
1.12.1 > 1.9beta2 ( [1,12,1] 中第2分段的「12」 > [1,9,beta,2] 中第2分段的「9」 )
3.1.0 > 3.1 ( [3,1,0] 的列表長度3 > [3,1] 的列表長度2 )
第三條原則是列表分段比較演算法
具體的演算法應用於兩個待比較的分段串,由於第二條原則的關係,這裡的串只可能都是數字或都是字母,例如 "12"、"abc"、"beta"
如果是數和數比較,那麼兩個串會看作兩個整數進行自然數比較,前導的零會被忽略,"12" -> 12,"00010" -> 10。
如果是字串和字串比較,那麼會進行如同 c 語言 strcmp() 函式的邏輯,按照 acsii 碼順序得出,排在後面的為新版本,小寫字母比大寫字母新。
如果是字串和數比較,那麼認定數比字串新。
123 > 121
svn > rc
alpha > beta
0 > beta
最後給出一些例子,應該足夠說明 rpm 包的版本號比較是如何的了。
1.00010 > 1.9,因為 10 > 9
2.02 = 2.2,因為 02 = 2
3.4.0 > 3.4,因為 3.4.0 多出乙個列表分段
5mgc25 = 5.mgc.25,因為分隔後的列表兩者相等
6.0 > 6beta,因為數字比字串新
**:
比較版本號
題目 比較兩個版本號 version1 和 version2。如果 version1 version2 返回 1,如果 version1 version2 返回 1,除此之外返回 0。你可以假設版本字串非空,並且只包含數字和 字元。字元不代表小數點,而是用於分隔數字序列。例如,2.5 不是 兩個半 ...
比較版本號
比較兩個版本號 version1 和 version2。如果 version1 version2 返回 1,如果 version1 version2 返回 1,除此之外返回 0。你可以假設版本字串非空,並且只包含數字和 字元。字元不代表小數點,而是用於分隔數字序列。例如,2.5 不是 兩個半 也不是...
比較版本號
比較版本號 比較兩個版本號 version1 和 version2。如果 version1 version2 返回1,如果 version1 version2 返回 1,除此之外返回0。你可以假設版本字串非空,並且只包含數字和.字元。字元不代表小數點,而是用於分隔數字序列。例如,2.5不是 兩個半 ...