Настройка пакета Deb для проекта Python — настройка базы данных (sqlite3)

Я пытаюсь сделать пакет .deb из проекта Python, над которым я работаю. Однако программе нужен файл .sqlite, который каким-то образом нужно инициализировать (создать его и настроить таблицы, ассоциации и т. д.). Хотя существует много документации по созданию пакетов deb, например.

-Из Debian Wiki

-Руководство по Python

Мне не удалось найти хороших предложений по следующим вопросам:

  1. лучше включить инициализированный файл .sqlite в список файлов для копирования (установки) или включить создание/настройку файла .sqlite в процесс установки?

  2. если второй вариант предпочтительнее, то куда должен идти скрипт создания таблицы? Я предполагаю, что очевидное предположение состоит в том, чтобы сделать это в файле правил (или нет?). И если этот процесс переходит в файл правил, должны ли мы делать это с помощью сценариев оболочки (правила - это make-файл)

  3. вторая ссылка выше предлагает использовать сценарий postinst (где можно решить вышеуказанную проблему), но я больше нигде не видел такой практики? Это обычная практика?

  4. как лучше всего проверить целевую машину на наличие зависимостей? (sqlite3, python3.2 - проверяет ли поле build-depends управляющего файла наличие зависимостей на целевой машине, чтобы прервать установку пакета, если, например, sqlite3 или python3.2 отсутствуют?

Большое спасибо


person pkaramol    schedule 01.08.2013    source источник


Ответы (2)


Я думаю, вам следует просто использовать предварительно сгенерированный файл SQLite. Это самое простое решение, и я не вижу никаких недостатков.

Что касается объявления зависимостей во время установки (иначе во время выполнения), вам нужно поместить их в debian/control, в раздел бинарного пакета, начиная с Package (пример). Таким образом, инструменты упаковки Debian откажутся устанавливать пакет, если такие зависимости неудовлетворительны (если только вы не попросите вежливо, например, используя dpkg --force-depends --install <package name>).

person tshepang    schedule 17.08.2013

После долгих проб и ошибок вот что на данный момент работает лучше всего:

  1. Файл базы данных sqlite создается во время (после) установки.

  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)
    )"
    

Основная проблема заключалась в следующем: приложение должно было находиться в каталоге /usr/share/myapplication, принадлежащем пользователю root, как это принято, а файл базы данных (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

Что касается зависимостей, Чепанг был прав, их нужно объявлять в управляющем файле. Однако, и я еще не понял этого, в некоторых случаях (машины) они были автоматически установлены, если они отсутствовали, а в других установка была прервана, как только отсутствовали зависимые пакеты.

person pkaramol    schedule 10.09.2013