为Python项目设置Deb包 - 数据库(sqlite3)设置

时间:2013-08-01 11:01:38

标签: python qt sqlite package debian

我正在尝试从我正在处理的python项目中创建一个.deb包。 该程序需要一个.sqlite文件,不知何故需要初始化(创建它并设置表,关联等)。 虽然有很多关于deb包创建的文档, e.g。

- From Debian Wiki

- A python-specific tutorial

我无法就以下问题找到好的建议:

  1. 最好将初始化的.sqlite文件合并到要复制(安装)的文件列表中,还是在安装过程中包含.sqlite文件创建/设置?

  2. 如果第二个选项更可取,表创建脚本应该放在哪里?我想明显的假设是在规则文件中这样做(或不?)。如果这个过程转到规则文件,我们应该通过使用shell脚本来执行此操作(规则是一个makefile)

  3. 上面的第二个链接建议使用postinst脚本(可以解决上述问题),但我还没有在其他任何地方看到这种做法?这是一种常见做法吗?

  4. 检查目标机器的依赖关系的最佳方法是什么? (sqlite3,python3.2 - 控制文件的build-depends字段是否检查目标机器上是否存在依赖项,以便在缺少sqlite3或python3.2的情况下中止软件包安装?

  5. 非常感谢

2 个答案:

答案 0 :(得分:0)

我认为你应该使用预先生成的SQLite文件。这是最简单的解决方案,我没有看到任何缺点。

至于声明安装时(又称运行时)依赖项,您需要将它们放在debian/control的二进制包部分中,一部分以Package开头(example )。这样,Debian打包工具将拒绝安装包,如果这些依赖关系不满意(除非你问得很好,例如使用dpkg --force-depends --install <package name>)。

答案 1 :(得分:0)

经过大量的反复试验后,目前看起来效果最好:

  1. 在(安装后)安装时间

  2. 生成sqlite db文件
  3. 我在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)
    )"
    
  4. 主要的挑战如下:应用程序应该放在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
    

    通过连续调用install -m

    ,在rules文件中安装了myapplication

    关于依赖关系,Tshepang是对的,它们应该在控制文件中声明。 但是,我还没想到,在某些情况下(机器),如果它们丢失,它们会自动安装,而在其他情况下,一旦依赖包丢失,安装就会中止。