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

8

У нас есть несколько собранных вручную (с fpm и jenkins) .deb файлов в локальном репозитории Apt (prespro). Эти .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.

Если я перечислю содержимое загруженного деба,

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
Поэтому принципиальное различие заключается в установке новой копии и обновлении существующей. Дает ли dpkg -D101 -i <package>(или даже dpkg -D1101) какие-либо разные результаты в каждом сценарии? Это может привести к другому порядку исполнения.
SmallClanger
Сможете ли вы предоставить копию своего postinst?
JMDT
@jmtd см. последнее изменение.
Том О'Коннор

Ответы:

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в случае хром) , и затем переместить его руку.

jmtd
источник
Я разместил это перед последним редактированием (на момент написания), которое предоставило postinst. Это говорит о том, что я угадал правильно. До сих пор не знаю, почему так postinstпроисходит, но, пожалуйста, попробуйте и посмотрите, сможете ли вы изменить порядок вещей, как я описал, чтобы посмотреть, решит ли это ваши проблемы.
JMTD
Я изменил сценарий postinst для использования desktop-file-install .. и вместо этого получил эту ошибку, Error on file "/usr/local/share/applications/silhouettefx-silhouette.desktop": No such file or directoryкоторая указывает, что это все еще может быть проблемой prerm
Том О'Коннор
1
Если вы помещаете файл рабочего стола в него /usr/share/applications, вам вообще не нужен postinst(или эквивалентный prermфрагмент) - попробуйте это.
JMDT
Ну хорошо, почему бы и нет.
Том О'Коннор
1
Я рад, что вы отсортированы, ура за награду :-)
jmtd
2

Именно сценарии postrm / prerm, вызывающие "xdg-desktop-menu --uninstall", являются виновниками, т.е.

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

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

Говоря о Google Chrome, они также включают эту строфу в начале своего сценария 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

Это неуклюжий подход к решению проблемы, но, похоже, он делает свое дело здесь (и для могучего Гуга тоже).

Павел

Пол Нендик
источник
Urgh. Я действительно надеюсь, что теперь есть веская причина сделать это таким образом, kludges продолжают становиться более ужасными :-)
jmtd
Вы так правы - я только что попробовал ваш способ, описанный выше, и он НАСТОЛЬКО лучше. Кто-то должен разобраться с хромовыми взглядами: D
Пол Нендик