条件付きのファイルとディレクトリのインストールでバイナリ.deb
パッケージを作成することは可能ですか(たとえば、ユーザーによる確認後の/etc/init.d/
でのinit
スクリプトのインストール)?
パッケージのインストール中に対話形式で質問するには、 debconf を使用する必要があります。構成ファイルを動的に作成および管理するには(および/etc/init.d/
内のファイルは構成ファイルと見なされます) cf を使用できます。
Debconfの使用方法に関するチュートリアルは、次の場所にあります。
http://www.fifi.org/doc/debconf-doc/tutorial.html
debconf
テンプレートこれをファイルdebian/templates
に入れます。インストール中にユーザーに表示されるテキストが含まれています。 demo-pkg
を実際のパッケージ名に置き換えてください!
Template: demo-pkg/install-init.d
Type: boolean
Default: false
Description: Would you like to install a service for this package?
Services are really cool! They allow stuff to be started in the
background without you having to start them manually!!!
これは、知る必要があることについてユーザーに(対話式に)尋ねる場所です。複数のパッケージをインストールする場合、dpkg
が実際のインストールプロセスを開始する前に、すべてのパッケージのこれらのファイルがすべて実行されるため、このスクリプトは特別です。これは、複数のパッケージがユーザーに何かを尋ねたい場合、パッケージごとに個別にではなく、すべてのパッケージのインストールの開始時にすべての質問が尋ねられることを意味します。
debian/config
という名前のファイルに次のものを入れて、実行可能としてマークします(demo-pkg
を正しいパッケージ名に置き換えてください)。
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
# Should an init job be installed?
db_input high demo-pkg/install-init.d || true
db_go
# You can also act upon the user's answers using `db_get`
#db_get demo-pkg/install-init.d
#[ "${RET}" = "false"] && echo "I don't think that was a wise decision..."
postinst
、prerm
およびpostrm
)ここでは、実際の魔法を行い、構成ファイル/ initスクリプトを動的に追加および削除します。これを機能させるには、initスクリプトをパッケージとともに通常のファイルとしてインストールする必要があります(この例では/usr/share/demo-pkg/init-service
と仮定しました)。
debian/postinst
ファイル(すべてのファイルがdpkg
によって抽出された後に呼び出されます):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
if [ "$1" = "configure" ];
then
# Check if the user decided the enable the service using `db_get`
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
# Install init script using `ucf`
ucf /usr/share/demo-pkg/init-service /etc/init.d/demo-service
# Register init script as service
update-rc.d demo-service defaults
# Start service
invoke-rc.d demo-service start
fi
fi
debian/prerm
ファイル(dpkg
によってファイルが削除される前、またはパッケージが新しいバージョンにアップグレードされる前に呼び出されます):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
# Load debconf library
. /usr/share/debconf/confmodule
# Check if the user decided the enable the service using `db_get`
db_get demo-pkg/install-init.d
if [ "${RET}" != "false" ];
then
# Stop the service before upgrade or removal
invoke-rc.d demo-service stop
if [ "$1" = "remove" ] || [ "$1" = "deconfigure" ];
then
# Unregister service prior to removal
update-rc.d -f demo-service remove
fi
fi
debian/postrm
ファイル(dpkg
によってすべてのファイルが削除された後に呼び出されます):
#!/bin/sh
# Make sure this script fails if any unexpected errors happen
set -e
if [ "$1" = "purge" ];
then
# Remove service file using `ucf` (checking whether `ucf` is still available first)
if type ucf >/dev/null 2>&1;
then
ucf --purge "/etc/init.d/demo-service"
fi
# Remove service file by hand (in case the above failed somehow)
rm -f "/etc/init.d/demo-service"
fi
Pre-Depends:
のdebconf
にdebian/control
依存関係を追加しますDepends:
のucf
への通常のdebian/control
依存関係を追加します/usr/share/demo-pkg/init-service
(またはあなたが呼ぶもの)が適切にインストールされていることを確認してください