1

ユーザー マシンにいくつかのファイルをインストールするために、Debian パッケージ ソースに取り組んでいます。debconf/config スクリプトと postinst スクリプトで使用されている共通のロジックがあります。そのため、共通ロジックを別のファイルに配置し、パッケージの一部として /usr/share/pkg-name/ の下に追加しました。

dpkg を使用してパッケージをインストールすると、すべて正常に動作します。最初にパッケージが解凍され、共通コード ベースを含むファイルが上記のパスに配置されます。次に、debconf/config スクリプトがファイルを読み取り、それに応じてユーザーにプロンプ​​トを表示します。

ファイルを APT リポジトリ内に配置すると、apt-get を使用してインストールすると、同じ手順が逆になります。パッケージは最初に解凍されず、代わりに debconf プロンプトが表示され、構成スクリプトは共通のコード ベースを含むスクリプトを見つけることができません。

インストール手順に違いがある理由を知りたいですか? apt-get を介してインストールするときに同じシーケンスを取得する方法はありますか? 3 つのファイルはすべてシェル スクリプトです。

さまざまなメンテナ スクリプトで使用される共通のコード ベースを処理するより良い方法はありますか?

4

1 に答える 1

1

クエスト終了!

これで、debconf マンページに記載されている完全なプロセスを理解できました。何と呼んでも、さまざまなフェーズやステップがあります。彼らです:

  • dpkg-preconfigure
  • dpkg-i
  • dpkg-再構成

これらのすべての手順により、ユーザーとの debconf 通信が開始されます。誰かが dpkg -i を使用してパッケージをインストールすると、同じコマンド ライン オプションで postinst スクリプトを実行する直前に構成スクリプトが実行されます。debconf 通信が開始されるまでに、パッケージはすでに解凍されています。

誰かが apt-get を使用してパッケージをインストールすると、最初に dpkg-preconfigure が実行されて構成スクリプトが実行され、次に dpkg -i が実際にパッケージをインストールされ、同じ構成スクリプトが再度実行されます。

apt-get の 2 番目のケースでは、構成スクリプトが dpkg-preconfigure の一部として実行されると、パッケージがまだ展開されていないため、この問題に直面していました。

ファイルが解凍された場合、または終了した場合に続行するif条件を追加しました

if [ ! -f /usr/share/pkg-name/common-codebase ];
 then
    exit 0
 fi
 /usr/share/pkg/common-codebase

この方法では、apt-get を使用してパッケージをインストールするときに、dpkg -i での 2 回目の試行が受け入れられている間、構成スクリプトを実行する dpkg-preconfigure 試行がスキップされます。ユーザーに尋ねるdebconfの質問は他のパッケージには影響しないため、これは私にとってはうまくいきます。

テンプレートを共有していて、選択がパッケージ外のものに影響を与える可能性がある場合は、プロンプトを遅らせても、apt-get によってインストールされている他の関連/依存パッケージが dpkg-preconfigure ステップ中にユーザーにプロンプ​​トを表示することを覚えておいてください。この解決策を試す前に、問題がないことを確認してください。

于 2014-10-20T07:21:27.060 に答える