3

私が取り組んでいる python プロジェクトから .deb パッケージを作成しようとしています。ただし、プログラムには .sqlite ファイルが必要で、何らかの方法で初期化する必要があります (ファイルを作成し、テーブル、関連付けなどを設定します)。deb パッケージの作成に関するドキュメントはたくさんありますが、たとえば

- Debian Wiki より

- Python 固有のチュートリアル

次の質問に関して、良い提案を見つけることができませんでした。

  1. 初期化された .sqlite ファイルをコピー (インストール) するファイルのリストに組み込むのと、インストール プロセスに .sqlite ファイルの作成/セットアップを含めるのとではどちらがよいでしょうか?

  2. 2 番目のオプションが望ましい場合、テーブル作成スクリプトはどこに移動する必要がありますか? 明らかな前提は、ルールファイルでそれを行うことだと思います(またはしない?)。そして、このプロセスがルール ファイルに行く場合、シェル スクリプトを使用してこれを行う必要があります (ルールはメイクファイルです)。

  3. 上記の 2 番目のリンクは、postinst スクリプトの使用を示唆しています (上記の問題に対処できる場合)。それは一般的な慣行ですか?

  4. ターゲット マシンの依存関係をチェックする最善の方法は何ですか? (sqlite3、python3.2 - 制御ファイルの build-depends フィールドは、ターゲット マシンに依存関係が存在するかどうかをチェックし、たとえば sqlite3 または python3.2 が見つからない場合にパッケージのインストールを中止しますか?

どうもありがとう

4

2 に答える 2

0

多くの試行錯誤の後、当分の間最もうまく機能していると思われるのは次のとおりです。

  1. sqlite db ファイルは、(ポスト) インストール時に生成されます。

  2. postinst ファイル内で、bash スクリプトとして使用し、次のようにテーブル作成と主キー/外部キーの割り当てステートメントに定数を使用してそれを行いました

    #!/bin/bash
    set -e
    
    CREATE_TBL_PROBLEMS="CREATE TABLE tblProblems(
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    Name TEXT NOT NULL UNIQUE
    )"
    
    CREATE_TBL_MAIN="CREATE TABLE tblMain (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    DBVersion TEXT NOT NULL,
    DBrDate TEXT NOT NULL)"
    
    CREATE_TBL_EVENTS="CREATE TABLE tblEvents (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    User TEXT NOT NULL,
    NoOfInfections INTEGER NOT NULL,
    NoOfHealings INTEGER NOT NULL,
    DateTime TEXT NOT NULL,
    VirusDBID INTEGER NOT NULL,
    FOREIGN KEY(tblMainID) REFERENCES tblMain(ID)
    )"
    
    CREATE_TBL_ISSUES="CREATE TABLE tblIssues (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    FilePath TEXT NOT NULL,
    Inode INTEGER NOT NULL UNIQUE,
    ScanEventID INTEGER NOT NULL,
    MalwareID INTEGER NOT NULL,
    FOREIGN KEY(EventID) REFERENCES tblEvents(ID),
    FOREIGN KEY(ProblemID) REFERENCES tblProblems(ID)
    )"
    

主な課題は次のとおりでした。アプリケーションは、一般的な慣行として root が所有する /usr/share/myapplication に配置する必要があり、db ファイル (sqlite) はユーザー所有のファイルにする必要がありました。したがって、後者は次のように /home/user1/.myapplication に配置されました。

USER_HOME=$(eval echo ~${SUDO_USER})
echo "USER HOME IS  "  ${USER_HOME}

case "$1" in

  configure)
    mkdir -p "${USER_HOME}"/.myapplication
    echo "Creating tables needed for myapplication"
    sqlite3 "${USER_HOME}"/.myapplication/mydbfile.sqlite "${CREATE_TBL_MAIN}; ${CREATE_TBL_EVENTS}; ${CREATE_TABLE_ISSUES}; ${CREATE_TBL_PROBLEMS}"
    echo "Assigning myapplication.sqlite file to user " "${SUDO_USER}"
    chown -R "${SUDO_USER}":"${SUDO_USER}" "${USER_HOME}"/.myapplication/
  ;;

  abort-upgrade|abort-remove|abort-deconfigure)
        exit 0
  ;;

  *)
        echo "postinst called with unknown argument \`$1'" >&2
        exit 1
  ;;

esac

myapplication のインストールは、install -m を連続して呼び出すことにより、ルール ファイル内で処理されました。

依存関係については、Tshepang が正しく、制御ファイルで宣言する必要があります。しかし、私はまだそれを理解していません.いくつかのケース(マシン)では、それらが見つからない場合は自動的にインストールされ、他のパッケージでは依存パッケージが見つからないとすぐにインストールが中止されました.

于 2013-09-10T16:01:08.237 に答える
0

事前に生成された SQLite ファイルを使用する必要があると思います。これは最も簡単な解決策であり、欠点は見当たりません。

インストール時 (別名、実行時) の依存関係を宣言する場合は、 ( exampledebian/control )で始まるバイナリ パッケージ セクションに配置する必要があります。そうすれば、そのような依存関係が満たされない場合、Debian パッケージ ツールはパッケージのインストールを拒否します (たとえば、 を使用して適切に要求しない限り)。Packagedpkg --force-depends --install <package name>

于 2013-08-17T11:28:10.683 に答える