post-inst 명령어 및 .desktop 파일을 사용한 apt-get의 이상한 동작


8

로컬 Apt 저장소 (reprepro)에 수많은 직접 빌드 한 (fpm 및 jenkins) .deb 파일이 있습니다. 이 .deb에는 xdg-desktop이 post-inst 스크립트에서 선택할 수있는 .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

귀하의 사본을 제공 할 수 postinst있습니까?
jmtd

@jmtd는 최신 편집 내용을 참조하십시오.
Tom O'Connor

답변:


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, 그러나 아마 기타 (정확한 대상 OS 버전 등에 따라 다름)

적어도 필자의 경우 xdg-desktop-menu수동으로 실행 하는 것을 달성하기에 충분합니다 (프로그램이 사용자 메뉴에 즉시 표시됨)

나는 이유에 어둠 속에서 여전히있어 google-chrome-stable및 기타 (주로 제 3 자) .deb어딘가로 바탕 화면 파일 제공에요 다른 것보다 /usr/share/applications( /opt크롬의 경우)을 다음으로 직접 이동합니다.


나는 이것을 제공 한 최신 편집 (작성 시점) 전에 이것을 게시했습니다 postinst. 그것은 내가 올바르게 추측했다고 제안하는 것 같습니다. 그래도 왜 그렇게하는지 postinst모르겠지만, 앞에서 설명한대로 문제를 해결할 수 있는지 살펴보십시오.
jmtd

postinst 스크립트를 수정하여 desktop-file-install.을 사용했습니다. 대신이 오류가 발생합니다.이 오류 Error on file "/usr/local/share/applications/silhouettefx-silhouette.desktop": No such file or directory는 여전히 prerm 문제 일 수 있음을 나타냅니다
Tom O'Connor

1
데스크톱 파일을에 넣으면 전혀 또는 그와 비슷한 스 니펫이 /usr/share/applications필요하지 않습니다 . 시도해보십시오. postinstprerm
jmtd

아, 왜 안돼?
Tom O'Connor

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 파일이 삭제됩니다. 아주 좋아요

구글 크롬 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도 마찬가지)를 수행하는 것 같습니다.


어. 정말 지금이 방법을 수행하기위한 좋은 이유는 잡든지이가 계속 거기에 희망을 더 무시 무시한 :-)
jmtd

당신이 옳습니다-방금 위에서 설명한 방법을 시도해 보았으므로 훨씬 좋습니다. 누군가 크롬
흠을
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.