apt-get 在安装后指令和 .desktop 文件中的奇怪行为

apt-get 在安装后指令和 .desktop 文件中的奇怪行为

我们在本地 Apt 存储库 (reprepro) 中拥有大量手动构建的 (使用 fpm 和 jenkins) .deb 文件。这些 .deb 文件包含一个 .desktop 文件,该文件将在安装后脚本中由 xdg-desktop 获取。

如果我们在新系统上手动安装 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

没有错误。所以...问题是这些:

  1. 这是预期的行为,还是 apt/dpkg 中的错误?
  2. 我们的 customthingy.deb 软件包是否格式错误,导致无法进行将来的重新安装?
  3. 是否可以安全地假设 post-inst 总是会在安装的最后发生,并且我们可以安全地假设所有文件都在此时间点之前已被提取?
  4. 我们是不是正在做一些非常奇怪的事情?

答案1

我猜你postinst正在调用xdg-desktop-menu将桌面文件移入/usr/share/applications并更新 XDG 桌面数据库。这是通过例如完成的google-chrome-stable,但我不明白为什么(继续阅读)

如果您将桌面文件直接安装到其中(通过 dpkg — 也就是说,例如/usr/share/applications通过 将文件放在那里,使得中的路径仅为),许多软件包将自动“触发”更新:尤其是和,但也许还有其他(取决于精确的目标操作系统版本等)dh_install.deb/usr/share/applicationsgnome-menusdesktop-file-utils

至少就我而言,这些足以实现xdg-desktop-menu手动运行的功能(程序会立即出现在我的用户菜单中)

我仍然不明白为什么google-chrome-stable其他(主要是第三方).deb会将桌面文件发送到某个地方其他/usr/share/applications/opt在 Chrome 的情况下)然后手动移动它。

答案2

罪魁祸首是调用“xdg-desktop-menu --uninstall”的 postrm/prerm 脚本,即

"$XDG_DESKTOP_MENU" uninstall --mode system /usr/local/share/applications/customthingy.desktop

这将在 xdg-desktop-menu 的 postinst 调用尝试使用 .desktop 文件之前删除该文件。非常好。

说到 google-chrome debs,他们还在他们的 prerm 脚本顶部包含了这一节:

action="$1"
if [ "$2" = "in-favour" ]; then
  # Treat conflict remove as an upgrade.
  action="upgrade"
fi
# Don't clean-up just for an upgrade.`
if [ "$action" = "upgrade" ] ; then
  exit 0
fi

这是一种解决问题的强硬方法,但似乎在这里很有效(对强大的 Goog 来说也是如此)。

保罗

相关内容