주어진 패키지에 패치를 적용하는 간단한 스크립트가 있는데, 해당 패키지가 업그레이드될 때마다 패치를 덮어쓰므로 각 업그레이드 후에 자동으로 패치를 적용하고 싶습니다.
/etc/apt/apt.conf.d/
이를 달성하기 위해 에 파일을 생성 하고 DPkg::Post-Invoke
. man apt-get
하지만 이 후크는 아무 관련이 없는 것 같습니다.apt-get
dpkg
어떤 특정 패키지이미 설치되어 있어서 패치를 적용해야 할지 모르겠습니다. 표준 입력에는 아무 것도 전달되지 않으며, 인수로 전달되는 것도 없으며 매뉴얼 페이지에는 이에 대해 아무 것도 나와 있지 않습니다.
그래서 이 문제를 해결하기 위해 제가 생각할 수 있는 유일한 일을 했습니다: 에 대한 또 다른 후크를 추가했습니다 DPkg::Pre-Install-Pkgs
.apt-get
앞으로패키지가 설치되었습니다. 이 후크는 (stdin을 통해) .deb
설치될 파일 목록을 가져 dpkg
오므로 파일 이름 중 패치하려는 패키지 이름과 일치하는 것이 있는지 확인하고 일치하면 설치될 파일 목록을 가져옵니다. /tmp
다른 후크가 실행될 때 먼저 해당 파일이 있는지 확인하고, 그렇다면 방금 설치된 패키지에 패치를 적용합니다.
이것은 내가 만든 파일입니다 /etc/apt/apt.conf.d/
.
DPkg::Pre-Install-Pkgs {
"while read -r pkg; do case $pkg in *somepkg*) touch /tmp/.patch && exit 0; esac done < /dev/stdin";
};
DPkg::Post-Invoke {
"[ -f /tmp/.patch ] && /home/marco/scripts/apply_somepkg_patch.sh && rm -f /tmp/.patch; exit 0";
};
분명히 해야 할 것은: apply_somepkg_patch.sh
단순히 패키지에서 제공하는 파일의 내용을 편집합니다. 나는 그 파일이업그레이드 및 패치매번 업그레이드되지 않도록 "잠그고" 싶지 않습니다.
이제 이 모든 것이 훌륭하게 작동하지만 제 눈에는 정말 더러워 보이고 약간 이상해 보입니다.이것을 달성하는 더 깨끗한 방법이 있습니까?어쩌면 그냥 DPkg::Post-Invoke
후크를 사용할까요? 아니면, DPkg::Post-Invoke
Hook에 어떤 패키지가 설치되어 있는지 알 수 있는 방법이 있나요?
편집하다: 101% 명확성을 위해 내가 하고 있는 작업에 대한 자세한 예를 추가합니다. 하지만 위에서 말한 내용에 더 많은 정보를 추가하지는 않는다고 생각합니다.
somepkg
제가 말하는 패키지가 바로 somefile
제가 패치하고 싶은 패키지에 의해 설치된 파일이라고 가정해보겠습니다 .
최초 설치
somepkg
, 내용somefile
:some_opt1 = some_value some_opt2 = some_value some_opt3 = a, b, c, d some_opt4 = some_value
패치를 적용하고 다음과 같이 변경합니다.
some_opt1 = some_value some_opt2 = some_value some_opt3 = X, Y, Z, d some_opt4 = some_value
업그레이드된
somepkg
콘텐츠somefile
:some_opt1 = some_value some_opt2 = some_value some_opt5 = some_value some_opt3 = a, b, c, d some_opt6 = some_value some_opt4 = some_value
패치를 적용하고 다음과 같이 변경합니다.
some_opt1 = some_value some_opt2 = some_value some_opt5 = some_value some_opt3 = X, Y, Z, d some_opt6 = some_value some_opt4 = some_value
자, 그게 무엇인지 somepackage
, somefile
어디에 있는지, 그 안에 무엇이 있는지 somefile
: 그게 전부입니다전혀 관련이 없는내 질문에. 당신이 알아야 할 것은동적으로 수정하고 싶은 것은 파일의 업그레이드 버전을 얻은 후 somefile
입니다 .somepkg
.
somefile
이것은 분명히 정적으로 수행될 수 없습니다. 내용을 읽고, 구문 분석하고 그에 따라 패치하려면 스크립트가 필요합니다 . 따라서 somepkg
업데이트할 때마다 스크립트가 자동으로 실행 되도록 하려면 apt-get
해당 스크립트가 자동으로 실행되어야 합니다.
답변1
현재 사용하고 있는 스타일이나 후크를 사용하여 apt
이를 수행하는 좋은 방법은 없습니다. dpkg
수정 중인 특정 패키지와 파일의 업그레이드를 위해 이러한 패치를 처리하는 쉬운 방법이 있을 수 있지만, 일반적인 솔루션을 원한다면 현재 데비안을 위한 가장 좋은 방법은 다음을 사용하는 것입니다.파일 트리거.
여기에는 다른 패키지(패치하려는 파일이 포함된 패키지)가 업그레이드될 때 파일 패치를 담당할 (간단한) 패키지를 생성하는 작업이 포함됩니다. 패치 패키지는 파일 트리거에 대한 관심을 선언해야 합니다. 이를 수행하려면 debian/triggers
단일 행을 포함하는 )이라는 파일을 추가하십시오.
interest /path/to/the/file/to/patch
그런 다음 패키지의 postinst
( debian/postinst
)에서 첫 번째 인수가 인지 확인하고 triggered
, 그렇다면 패치 스크립트를 실행합니다(또는 자신의 인수에 병합 postinst
). 패치 스크립트를 별도로 유지하려면 패치 패키지에 넣어 콘텐츠를 그대로 유지하면 됩니다.
이 모든 작업이 완료되면 패치 패키지를 빌드하고 설치합니다. 그러면 수정 중인 패키지를 업그레이드할 때마다 postinst
패치 패키지가 호출됩니다 .