web-dev-qa-db-ja.com

post-inst命令と.desktopファイルを使用したapt-getの奇妙な動作

ローカルのAptリポジトリ(reprepro)には、多数の手作り(fpmおよびjenkinsを使用)の.debファイルがあります。これらの.debsには、post-instスクリプトでxdg-desktopによって取得される.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. 私たちは非常に奇妙なことをしていますか?
8
Tom O'Connor

あなたのpostinstxdg-desktop-menuを呼び出して、デスクトップファイルを/usr/share/applicationsに移動し、XDGデスクトップデータベースを更新していると思います。これは、例えばによって行われます。 google-chrome-stable、しかし私は理由を理解することはできません(続きを読む)

代わりにデスクトップファイルを/usr/share/applicationsに直接インストールする場合(dpkgを介して—つまり、ファイルをdh_installを介してそこに配置し、.debのパスが/usr/share/applicationsになるようにする)、多くのパッケージが自動的に更新を「トリガー」します。 gnome-menusdesktop-file-utilsですが、おそらく他のものです(正確なターゲットOSバージョンなどによって異なります)

少なくとも私の場合、これらはxdg-desktop-menuを手動で実行することを達成するのに十分です(プログラムはすぐに私のユーザーメニューに表示されます)

google-chrome-stableと他の(主にサードパーティの).debsがデスクトップファイルを/usr/share/applications(Chromeの/opt)以外の場所otherに出荷する理由についてはまだ暗闇の中にいますケース)そしてそれを手で動かします。

4
jmtd

原因となっているのは、「xdg-desktop-menu--uninstall」を呼び出すpostrm/prermスクリプトです。

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

これにより、xdg-desktop-menuのpostinst呼び出しが.desktopファイルを使用しようとする直前に.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

これは問題を解決するための手間のかかるアプローチですが、ここで(そして強力なグーグルにとっても)トリックを行っているようです。

ポール

2
Paul Nendick