3

我正在尝试从我正在处理的 python 项目中制作一个 .deb 包。该程序需要一个 .sqlite 文件,但需要以某种方式初始化(​​创建它并设置表、关联等)。虽然有很多关于 deb 包创建的文档,例如

-来自 Debian 维基

-特定于 python 的教程

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

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

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

  3. 上面的第二个链接建议使用 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 文件。这是最简单的解决方案,我没有看到任何缺点。

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

于 2013-08-17T11:28:10.683 回答