2011-03-25 57 views
1

我想阻止較舊的Debian軟件包跺腳Debian軟件包的較新安裝版本。獲取預裝Debian維護腳本的新版本

我試圖通過比較當前的Debian軟件包版本與debian/preinst維護腳本中當前安裝的版本來做到這一點。理想情況下,我想提供警告和(繼續y/n?)提示。

此問題與How to get the newly-installed version within a Debian postinst script?密切相關。這個問題是在09年創建的,所以我不確定是否適合在該問題中添加我的問題。

對舊問題的回答是,「爲什麼你不能簡單地在你的包中硬編碼版本?」

我的迴應是我不想在另一個位置管理版本。該版本已經在debian/changelog中,並且Python模塊的init .py腳本爲版本。這個邏輯還需要複製到我們正在維護的其他幾個內部Debian軟件包。理想情況下,我想通過從構建Debian軟件包的過程中刪除步驟來儘可能簡化此過程。

我已閱讀相關的Debian文檔http://www.debian.org/doc/debian-policy/ch-maintainerscripts.html,雖然我可以得到舊版本,但無法獲得我當前安裝的版本。

我在debian/preinst中迴應了env,它確實提供了一個環境變量,其中包含版本...:SUDO_COMMAND =/usr/bin/dpkg -i python-mypkg_1.9.3-2_all.deb。我應該可以通過這種方式獲取版本,但我不確定是否可以依賴此變量存在於將要部署到此包的每個發行版中。這樣做似乎也是一種詭計。

我知道dpkg-parsechangelog,這是一個很棒的工具,但它只適用於解壓縮包。它在文檔中也清楚地說明了這一點。

我也嘗試使用Python pckg_resources模塊來發現版本:pckg_resources.require(「mypkg」)[0]。 版本。如果模塊尚未安裝在目標機器上,它將會失敗 - 這是絕對有道理的。

似乎應該有一個選項,無論是在debian /控制文件或我可以用來防止這種情況發生,而無需重新發明輪子。謝謝大家!

+0

只有在用戶手動強制執行或者用戶設置了apt-pinning強制執行的情況下,才能在debian上降級軟件包。我不明白爲什麼你甚至需要這樣做,如果你只是想讓用戶'確認'這樣做,因爲他們已經'確認'他們想要這樣做。 – Arrowmaster 2011-03-25 22:20:17

+0

問題是,我們的內部進程指定了一個系統組件來安裝特定版本的Debian軟件包w/dpkg -i our_package.version.deb。我們沒有一個可以防止這些事情發生的適當來源。這個用例是:如果有兩個開放票據和兩個不同版本的同一個軟件包,並且在更新的版本之後推遲Debian安裝程序的「更舊」更改,它會踩踏新的更改。這應該在sysad進程中工作。然而,它並非如此,故障安全是必要的,以確保他們不會做出他們不打算做的改變。 – PeqNP 2011-03-28 17:11:44

+0

奇怪新版本不存在作爲維護者腳本的參數... – hudac 2017-11-01 14:11:31

回答

0

我打算使用SUDO_COMMAND。至少這樣做會使我不必將版本硬編碼到預先維護腳本中(它已經存在於其他兩個位置!!)。這是一個極端的黑客攻擊,但我一直沒有找到任何有用的文檔,可能會指導我採取更明智的做法。僅供參考,env變量SUDO_COMMAND似乎存在於我使用過的每個Debian環境中。