Debian · Linux misc

Meaning of Debian Package Version – 淺談 Debian package 版本意義以及使用時機

Debian 發行版由許多 open source packages 所組成 (.deb 格式)

每一個 Debian package 都具備版本號碼以進行版本控制, 而 Debian 版本號碼格式規定如下:

[epoch:]upstream_version[-debian_revision]

epoch: 若非必要, 則不建議使用. 之後的內容會敘述原因. 一般 package 通常省略 epoch 版本號

upstream_version:  open source 上游 (upstream) 的版本號碼. 有時後面會加一些符號 {. + – ~}.

比較常見的是 {+, ~} 這兩個符號, 這兩者主要的差異為版本的大小. 若本機版本小於最新版本, 才會進行自動安裝更新. 否則需要指定版本才能安裝.

舉例來說, 若一個 open source project 版本為 1.3.0, 則加上符號的版本大小依序為

1.3.0~XXX < 1.3.0 < 1.3.0+XXX
  • +: 代表同一版本內最大的版本, 能更新 1.3.0~XXX 以及 1.3.0 版本
  • ~: 代表同一版本內最小的版本.

-debian_revision 是 Debian 打包的版本號碼. 隨著每次上傳, 此版本號碼就會遞增

下列篇幅會介紹常見的 Debian package 版本其意義以及使用時機:

  • 1.13.0+ds1-3
  • 20180825+dfsg-1
  • 1:1.16.1-1.1
  • 0.14.0+really0.13.4-1
  • 1.2.1+git20180302.3a37a4e-1
  • 1.7.6-2+b1

 1.13.0+ds1-3

若 Debian source 和上游版本 (upstream source) 有所差異, 且造成差異的的主因不是因為違反 DFSG [1], 會需要使用 ds (“Debian Source" 縮寫) 以表示和原始上游版本有所不同.

[1] https://www.debian.org/social_contract#guidelines

相關修改資訊需存放於 debian/README.source 檔案中 [2].

[2] https://www.debian.org/doc/debian-policy/ch-source.html#source-package-handling-debian-readme-source

使用時機:
  1. 當 upstream source 中含有第三方函式庫 – 應把此第三方函式庫移除, 並找到相對應 package 列入依賴清單中.
  2. Upstream source 中含有 debian 資料夾 – 應把 debian 資料夾移除. 並重新建立合規的 debian 檔案

以上的修改, 建議回饋給上游. 若上游接受, 則在下版之後即可不需重新打包以及使用 ds 版本號. 否則在每一次更新都需進行重新打包的動作.


 20180825+dfsg-1

若 Debian source 和上游版本 (upstream source) 有所差異, 且造成差異的的主因是因為違反 DFSG [1], 會需要使用 dfsg (“Debian Free Software Guildelines" 縮寫) 以表示和原始上游版本有所不同.

相關修改資訊需存放於 debian/README.source 檔案中 [2].

使用時機:
  1. 當 upstream source 中含有非開源 (non-free) 元件 – 應把此非開源 (non-free) 元件移除. 若無法移除, 則需考慮放棄重新打包並放入 contrib [3] or non-free [4] archive 中
  2. Upstream source 中含有被壓縮過的原始碼, 如 minified JavaScript or CSS – 應把壓縮原始碼移除. 並使用完整原始碼

[3] https://www.debian.org/doc/debian-policy/ch-archive.html#the-contrib-archive-area

[4] https://www.debian.org/doc/debian-policy/ch-archive.html#the-non-free-archive-area

以上的修改, 建議回饋給上游. 若上游接受, 則在下版之後即可不需重新打包以及使用 dfsg 版本號. 否則在每一次更新都需進行重新打包的動作.


 1:1.16.1-1.1

若 upstream 修改了版本號碼機制, 造成版本號規則迥異. 則需使用 “epoch" [5] 版本號來區別之前的版本. “epoch" 需被謹慎使用, 使用前需寄信至 debian-devel [6] mailing-list 討論

[5] https://www.debian.org/doc/debian-policy/ch-controlfields.html#version

[6] https://lists.debian.org/debian-devel/

使用時機:
  1. 若 upstream 將原本版本號從 20190102 改為 1.0, 此時會因為版本號 1 < 2019 導致更新議題 – 應寄信至 debian-devel [6] 討論, 取得共識後才使用 epoch.

如果能說服上游作者 (upstream author) epoch 版本號應謹慎使用, 因使用 epoch 會破壞現存版本相依性. 使用前務必要經過公開 mailing list – debian-devel 討論並產生共識.


√ 0.14.0+really0.13.4-1

當上游 (upstream source) 因故回溯其版本編號, 需使用 really [7] 而不是 epoch 方式來進行編號. 避免產生使用 epoch 的負面作用.

使用時機:
  1. 若 upstream 將原本使用版本號 0.14.0 改為 0.13.4, 此時會因為版本號 0.13.4 < 0.14.0 導致更新議題 – 將新版本號加上 really 並結合至原本版本. e.g., 0.14.0+really0.13.4-1.

[7] https://www.debian.org/doc/debian-policy/ch-controlfields.html#epochs-should-be-used-sparingly


√ 1.2.1+git20180302.3a37a4e-1

此為上游 (upstream source) 快照版本 (snapshot version), 意思是 2018年3月2號時送出的 git commit, 且此 commit hash 為 3a37a4e 時的版本.

使用時機:
  1. 上游不對程式碼進行定版的動作 – 將版本定為 0.0~gitYYYYMMDD.COMMIT_HASH
  2. 上游目前版本號為 1.2.1, 在釋出下一版 1.2.2 前修正了重大漏洞, 需即時更新 – 將版本定為 1.2.1+gitYYYYMMDD.COMMIT_HASH

√ 1.7.6-2+b1

若 package 因為編譯環境而非 package 本體而造成問題 [8], 可申請進行重新編譯之動作 [9], 編譯成功後, 機器會自動修改版本號並上傳. 此動作稱為 “binary-only non-maintainer upload". 因為沒有對原始碼進行任何變動.

使用時機:
  1. 該 package 的相依函式庫版本變動 (library transitions) 導致編譯失敗 – 寄信申請重新編譯

要注意的是只有 arch: any 屬性的 package 能進行重新編譯的行為, 且編譯後也不會修改 debian/changelog 的內容.

[8] https://wiki.debian.org/binNMU

[9] https://release.debian.org/wanna-build.html


 

 

發表迴響