Назад | Перейти на главную страницу

Странное поведение apt-get с инструкциями post-inst и файлами .desktop

У нас есть несколько созданных вручную (с помощью fpm и jenkins) файлов .deb в локальном репозитории Apt (репозиторий). Эти .debs содержат файл .desktop, который будет загружен xdg-desktop в сценарии post-inst.

Если мы установим файл deb вручную, в новой системе все будет хорошо.

Если мы установим новую версию с помощью apt-get install, мы получим эту ошибку

xdg-desktop-menu: file '/usr/local/share/applications/customthingy.desktop' does not exist

Если я загружаю файл deb с помощью apt-get install -d customthingy и запускаю

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. Мы делаем что-то очень странное?

Я предполагаю твой postinst звонит xdg-desktop-menu переместить файл рабочего стола в /usr/share/applications и обновите базу данных рабочего стола XDG. Это делается, например, google-chrome-stable, но я не могу понять почему (читайте дальше)

Если вы установите файл рабочего стола прямо в /usr/share/applications вместо этого (через dpkg - то есть поместить файл туда через dh_install например, такой, что путь в .deb просто /usr/share/applications), ряд пакетов будет автоматически запускать обновления: в частности gnome-menus и desktop-file-utils, но, возможно, другие (в зависимости от конкретной целевой версии ОС и т. д.)

По крайней мере, в моем случае этого достаточно, чтобы добиться того, xdg-desktop-menu вручную (программа сразу появляется в моем пользовательском меню)

Я все еще в неведении, почему google-chrome-stable и другие (преимущественно сторонние) .debs отправить файл рабочего стола куда-нибудь Другой чем /usr/share/applications (/opt в случае с хромом), а затем переместите его вручную.

Виной всему скрипты postrm / prerm, вызывающие "xdg-desktop-menu --uninstall", т.е.

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

Это удалит файл .desktop прямо перед тем, как вызов postinst xdg-desktop-menu попытается его использовать. Очень хорошо.

Говоря о 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 тоже).

Павел