- パッケージのアトミック性(製品を単一ファイルとして提示);
- スクリプトのインストール前/インストール後/ソフトウェアの削除の存在;
- ソフトウェアの依存関係を指定することができます。
プロジェクト構造
したがって、次のファイル構造を持つSVN制御下のmy-app Webプロジェクトを検討してください。
/ | -config | | -parameters.ini | -htdocs | | -index.php | -libs |-テンプレート
パッケージ構造
パッケージをビルドするには、特定のファイルとスクリプトのセットが必要です。これらは.packageフォルダーに配置され、プロジェクトのルートに追加されます。 このフォルダーの構造は次のようになります。
/|-.structure | | -DEBIAN | | | -conffiles | | | -control | | | -postinst | | | -postrm | | | -preinst | | | -prerm | | |-テンプレート | | -etc | | -var | | | -log | | | -www | -package.xml | -package.properties
実際、.structureカタログは将来のパッケージです。 DEBIANサブディレクトリには、以下で説明するサービスファイルが含まれています。 他のすべてのディレクトリは、Debian Linuxファイルシステムのディレクトリ階層を完全に繰り返します。 package.xmlおよびpackage.propertiesファイルには、 Apache Antユーティリティを使用してパッケージを作成するためのスクリプトと設定が含まれています。 しかし、まず最初に。
Debianディレクトリ
DEBIANディレクトリには、プロジェクト設定ファイルとインストール前後のアンインストールスクリプトが含まれています。
conffilesファイルには、インストール中に上書きされるべきではない設定ファイルのリストが含まれています。
/etc/my-app/parameters.ini
ここでは、プロジェクト設定ファイルがここに示されます。
制御ファイルには、パッケージに関する一般情報が含まれています。
Package: my-app
Version: {{{VERSION}}}
Section: user
Priority: optional
Architecture: all
Installed-Size: 0
Maintainer: Mikhail Krestjaninoff <mikhail.krestjaninoff@gmail.com>
Depends: nginx, php5-common (>= 5.2), php5-cli
Description: My application
このファイルの個別の注意は、Version VersionとDependsのポイントに値します。 パッケージバージョンとして定数{{{VERSION}}}を具体的に示します。これは、将来パッケージをアセンブルするときに現在の値に置き換えるためです。 依存関係のリストでは、nginxとphpのみを示しましたが、プロジェクトで追加のパッケージ(phpモジュールなど)を使用する場合は、それらを明示的にリストすることができます。これにより、バトルサーバーに投稿する際のプロジェクトの誤操作のリスクを軽減できます。
preinstファイルには、次のプリセットスクリプトが含まれています。
#!/bin/sh
この場合、事前の手順は必要ないため、ファイルは空です。
postinstファイルには、インストール後のスクリプトが含まれています。 この場合、スクリプトは権限を設定し、 debconfユーティリティを使用して構成を構成し、一時ファイル用のディレクトリを作成します。
#!/bin/sh if [ configure = "$1" ]; then # Set permissions chown -R www-data:www-data /etc/my-app/ chmod -R 0664 /etc/my-app/ chown -R www-data:www-data /var/www/my-app/ chmod -R 0664 /var/www/my-app/ chown -R www-data:www-data /var/log/my-app/ chmod -R 0664 /var/log/my-app/ # Set up configuration file . /usr/share/debconf/confmodule db_input critical db/dsn || true db_go db_fset db/dsn seen false || true db_get db/dsn || true DSN=$RET DSN=`echo "$DSN" | sed 's/\//\\\\\//g'`; sed -is/{{DSN}}/$DSN/ /etc/my-app/parameters.ini # Create directories for temporary files CACHE_DIR="/var/www/my-app/templates/cache" COMPILED_DIR="/var/www/my-app/templates/compiled" if [ ! -d $CACHE_DIR ] then mkdir -p $CACHE_DIR chown -R www-data:www-data $CACHE_DIR chmod -R 0664 $CACHE_DIR fi if [ ! -d $COMPILED_DIR ] then mkdir -p $COMPILED_DIR chown -R www-data:www-data $COMPILED_DIR chmod -R 0664 $COMPILED_DIR fi fi
必要に応じて、プロジェクトデータベースを作成するためのスクリプトもこのファイルに追加できます。 データベースを更新すると、タスクはやや複雑になります。 ただし、2つのsqlファイルをプロジェクトに保存することにより、部分的に許可することができます。構造/データを再現するためのコマンドセット(初期インストール)および以前のリリースからの変更(更新用)。
prermファイルには、インストール前スクリプトが含まれています。 この場合、スクリプトは一時ファイルのディレクトリを削除します。
#!/bin/sh if [ remove == "$1" -o purge == "$1" ]; then # Remove directories for temporary files CACHE_DIR="/var/www/my-app/templates/cache" if [ -e $CACHE_DIR ]; then rm -rf $CACHE_DIR fi COMPILED_DIR="/var/www/my-app/templates/compiled" if [ -e $COMPILED_DIR ]; then rm -rf $COMPILED_DIR fi fi
テンプレートファイルには、 debconfユーティリティのフィールドテンプレートが含まれています。
Template: db/dsn Type: string Default: postgres://user@passwd:localhost/my-app Description: Database Source Name. Example: postgres://user@passwd:localhost/my-app
DEBIANカタログの内容の詳細については、 opennetまたは公式ドキュメントを参照してください 。
パッケージ構築スクリプト
ここで、プロジェクトに基づいて本格的なパッケージを作成するために、パッケージのファイル構造(データを含む.structureディレクトリのルートを持つファイルシステム)に入力する必要があります。 これを行うには、プロジェクトファイルシステムからパッケージファイルシステムに必要なデータをコピーするスクリプトの小さなセットを作成する必要があります。 この目的でApache Antを使用した結果、 package.xmlおよびpackage.propertiesファイルを取得しました。
package.propertiesファイルには、パッケージをビルドするための設定が含まれています。
package.name=my-app package.version=1.0.0
メインのビルドスクリプトはpackage.xmlファイルに含まれています。
<? xml version ="1.0" encoding ="UTF-8" ? >
< project basedir =".." default ="prepare" name ="package-builder" >
< property file ="./.package/package.properties" />
< property name ="location" value ="." />
< property name ="package.structure" value ="${location}/.package/.structure" />
< property name ="package.source" value ="${location}/.package/source" />
< property name ="package.target" value ="${location}/.package/target" />
<!-- Init project -->
< target name ="init" >
< mkdir dir ="${package.source}" />
< mkdir dir ="${package.target}" />
</ target >
<!-- Clean project -->
< target name ="clean" >
< delete dir ="${package.source}" />
< delete dir ="${package.target}" />
</ target >
<!-- Prepare project files for package -->
< target depends ="init" name ="prepare" >
< copy toDir ="${package.source}" >
< fileset dir ="${package.structure}" >
< include name ="**/*" />
< exclude name =".svn" />
</ fileset >
</ copy >
< mkdir dir ="${package.source}/etc/${package.name}" />
< copy toDir ="${package.source}/etc/${package.name}" >
< fileset dir ="config" >
< include name ="**/*" />
< exclude name =".svn" />
</ fileset >
</ copy >
< mkdir dir ="${package.source}/var/www/${package.name}/htdocs" />
< copy toDir ="${package.source}/var/www/${package.name}/htdocs" >
< fileset dir ="htdocs" >
< include name ="**/*" />
< exclude name =".svn" />
</ fileset >
</ copy >
< mkdir dir ="${package.source}/var/www/${package.name}/libs" />
< copy toDir ="${package.source}/var/www/${package.name}/libs" >
< fileset dir ="libs" >
< include name ="**/*" />
< exclude name =".svn" />
</ fileset >
</ copy >
< mkdir dir ="${package.source}/var/www/${package.name}/templates" />
< copy toDir ="${package.source}/var/www/${package.name}/templates" >
< fileset dir ="templates" >
< include name ="**/*" />
< exclude name =".svn" />
< exclude name ="cache" />
< exclude name ="compiled" />
</ fileset >
</ copy >
</ target >
<!-- Build packege -->
< target depends ="prepare" name ="build" >
<!-- Change owner to root -->
< exec executable ="fakeroot" dir ="${package.source}" >
< arg line ="chown -R root:root ." />
</ exec >
<!-- Allow execution for installation scripts -->
< exec executable ="fakeroot" dir ="${package.source}/DEBIAN" >
< arg line ="chmod 0755 preinst postinst prerm postrm" />
</ exec >
<!-- Set package version -->
< exec executable ="sed" >
< arg line ="-is/{{{VERSION}}}/${package.version}/ ${package.source}/DEBIAN/control" />
</ exec >
<!-- Build package -->
< exec executable ="dpkg-deb" >
< arg line ="--build ${package.source} ${package.target}/${package.name}_${package.version}_all.deb" />
</ exec >
</ target >
</ project >
* This source code was highlighted with Source Code Highlighter .
パッケージアセンブリ
これで、 .packageディレクトリの作成が完了しました。 これで、プロジェクトの残りの部分とともにSVNにコミットできます。 パッケージをビルドする必要がある場合(たとえば、テストまたはバトルを行うためにリリース/ラベルを付ける) 、. packageディレクトリに移動し、
ant -f package.xml build
を実行するだけで十分です。これにより、 .package / targetディレクトリに新しいパッケージが作成されます。 debパッケージを使用する準備ができました!