特定のパッケージにパッチを適用する簡単なスクリプトがあります。パッケージがアップグレードされるたびにパッチが上書きされるため、各アップグレード後に自動的にパッチを適用したいと思います。
/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のための最良の方法は次のようにすることです。ファイルトリガー。
これには、他のパッケージ(パッチするファイルを含むパッケージ)がアップグレードされたときにファイルのパッチを担当する(簡単な)パッケージを作成することが含まれます。パッチパッケージはファイルトリガーに対する関心を宣言する必要があります。これを行うには、debian/triggers
単一行を含む)というファイルを追加します。
interest /path/to/the/file/to/patch
次に、パッケージのpostinst
(debian/postinst
)で最初の引数があることを確認しtriggered
、そうであればパッチスクリプトを実行します(または自分の引数にマージpostinst
)。パッチスクリプトを別々に保持するには、パッチパッケージに入れてコンテンツをそのまま残します。
これがすべて完了したら、パッチパッケージをビルドしてインストールします。これにより、変更中のパッケージをアップグレードするたびにpostinst
パッチパッケージが呼び出されます。