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


8

ローカル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. 私たちは非常に奇妙なことをしていますか?

1
したがって、決定的な違いは、新しいコピーのインストールと既存のコピーのアップグレードの間の違いです。dpkg -D101 -i <package>(あるいはdpkg -D1101)は、各シナリオのいずれかの異なる結果を生成しますか?異なる実行順序がスローされる場合があります。
SmallClanger、2012年

あなたのコピーを提供できますpostinstか?
jmtd 2012年

@jmtd最新の編集を参照してください。
トム・オコナー

回答:


4

デスクトップファイルをXDGデスクトップデータベースに移動して更新するようにpostinst要求xdg-desktop-menuしていると思い/usr/share/applicationsます。これはegによって行われgoogle-chrome-stableますが、理由を理解することはできません(続きを読む)

あなたはに直接、デスクトップのファイルをインストールする場合/usr/share/applications(dpkgの経由-を経由してそこにファイルを置く、である代わりにdh_install、このようなパスであること、例えば.debちょうどである/usr/share/applications)、パッケージの数は、自動的に「トリガー」の更新プログラムは以下となります。特にgnome-menusdesktop-file-utils、おそらくその他(正確なターゲットOSバージョンなどに依存)

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

私は理由として暗闇の中ではまだだgoogle-chrome-stableし、他の(主にサードパーティ).debのどこかにsの船デスクトップファイルよりも/usr/share/applications/optChromeの場合)、その後で手に移動します。


を提供した最新の編集(執筆時)の前にこれを投稿しましたpostinst。それは私が正しく推測したことを示唆しているようです。なぜそうなのかはまだpostinstわかりませんが、問題を解決できるかどうかを確認するために、私が説明したように再配置できるかどうか試してみてください。
jmtd 2012年

postinstスクリプトを変更して、desktop-file-install ..を使用し、代わりにこのエラーを取得しました。Error on file "/usr/local/share/applications/silhouettefx-silhouette.desktop": No such file or directoryこれは、まだ問題の問題である可能性があることを示しています
Tom O'Connor

1
デスクトップファイルをに配置した場合/usr/share/applications、は必要ありませんpostinst(または同等のprermスニペット)。それを試してください。
jmtd 2012年

ええと、なぜでしょうか。
トム・オコナー

1
私はあなたがソートされてうれしいです、賞金のために乾杯します:-)
jmtd

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でも)トリックを実行しているようです。

ポール


ああ。私は今、これをこのように行うための十分な理由があることを本当に願っています。
クラッジは

あなたはとても正しいです-私は上記のあなたの方法を試してみましたが、それはとても良いです。誰かがクロムのぞき見を整理する必要があります:D
Paul Nendick 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.