帶有安裝後指令和 .desktop 文件的 apt-get 的奇怪行為
我們在本地 Apt 儲存庫 (reprepro) 中有許多手工建構的(使用 fpm 和 jenkins).deb 文件。這些 .deb 包含一個 .desktop 文件,xdg-desktop 將在 post-inst 腳本中獲取該文件。
如果我們手動安裝 deb 文件,在新系統上,一切都很好。
如果我們使用 apt-get install 安裝新版本,我們會收到此錯誤
xdg-desktop-menu: file '/usr/local/share/applications/customthingy.desktop' does not exist
如果我使用 apt-get install -d customthingy 下載 deb 文件,然後執行
dpkg -i /var/cache/apt/archives/customthingy_2-r3_all.deb
我得到了
xdg-desktop
和以前一樣的錯誤。所以這排除了apt的問題。如果我列出下載的 deb 的內容,
tom.oconnor@charcoal-black:~$ dpkg --contents /var/cache/apt/archives/customthingy_2-r3_all.deb |grep ".desktop" -rw-r--r-- root/root 201 2011-07-28 20:02 ./usr/local/share/applications/customthingy.desktop
可以看到文件存在。
但是..如果我們在重新安裝之前清除,
tom.oconnor@charcoal-black:~$ sudo apt-get purge customthingy Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED customthingy* 0 upgraded, 0 newly installed, 1 to remove and 84 not upgraded. After this operation, 0B of additional disk space will be used. Do you want to continue [Y/n]? y (Reading database ... 219342 files and directories currently installed.) Removing customthingy ... Purging configuration files for customthingy ...
進而
tom.oconnor@charcoal-black:~$ sudo apt-get install customthingy Reading package lists... Done Building dependency tree Reading state information... Done The following NEW packages will be installed customthingy 0 upgraded, 1 newly installed, 0 to remove and 84 not upgraded. Need to get 0B/4,030B of archives. After this operation, 0B of additional disk space will be used. Selecting previously deselected package customthingy. (Reading database ... 219319 files and directories currently installed.) Unpacking customthingy (from .../customthingy_2-r3_all.deb) ... Setting up customthingy (2-r3) ...
編輯: Postinst 腳本的內容
#!/bin/sh # Add an entry to the system menu XDG_DESKTOP_MENU="`which xdg-desktop-menu 2> /dev/null`" if [ ! -x "$XDG_DESKTOP_MENU" ]; then echo "WARNING: Could not find xdg-desktop-menu" >&2 else "$XDG_DESKTOP_MENU" install --mode system /usr/local/share/applications/customthingy.desktop "$XDG_DESKTOP_MENU" forceupdate --mode system fi
沒有錯誤。所以..問題是這些:
- 這是預期的行為,還是 apt/dpkg 中的錯誤?
- 我們是否有一個帶有 customthingy.deb 的格式錯誤的包,它阻止了未來的重新安裝執行?
- 是否可以安全地假設 post-inst 總是在安裝結束時發生,並且我們可以安全地假設所有文件都將在此時間點之前被提取?
- 我們在做一些非常奇怪的事情嗎?
我猜您
postinst
正在呼叫xdg-desktop-menu
將桌面文件移入/usr/share/applications
並更新 XDG 桌面數據庫。這是由 eg 完成的google-chrome-stable
,但我無法理解為什麼(繼續閱讀)如果您將桌面文件直接安裝到其中
/usr/share/applications
(通過 dpkg - 即,將文件放在那裡dh_install
,例如,使得路徑中的路徑.deb
只是/usr/share/applications
),許多軟體包將自動“觸發”更新:特別是gnome-menus
anddesktop-file-utils
,但也許其他(取決於精確的目標作業系統版本等)至少在我的情況下,這些足以實現
xdg-desktop-menu
手動執行的效果(程序立即顯示在我的使用者菜單中)我仍然不知道為什麼
google-chrome-stable
和其他(主要是第 3 方).deb
將桌面文件運送到(在 chrome 的情況下)以外的其他地方,然後手動移動它。/usr/share/applications``/opt