2013-08-01 40 views
3

我正在尝试使用我正在处理的python项目创建.deb包。 尽管程序需要.sqlite文件,但需要初始化(创建它并设置表,关联等)。 尽管在deb包创建方面有很多文档,例如 为Python项目设置Deb包 - 数据库(sqlite3)设置

- From Debian Wiki

- A python-specific tutorial

我没能找到有关下列问题很好的建议:

  1. 是它更好地纳入一个初始化.sqlite文件列表要复制(安装)的文件还是在安装过程中包含.sqlite文件创建/设置?

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

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

  4. 让目标机器检查依赖性的最佳方法是什么? (sqlite3的,python3.2 - 确实集结取决于控制文件检查字段是否在目标计算机上存在的依赖关系,以便中止软件包安装如果例如sqlite3的或python3.2丢失

?非常感谢

回答

0

我觉得你应该去预先生成的SQLite文件,这是最简单的解决方案,我看不出有什么不足之处。

至于宣布安装时(也就是,游程时间)相关性,您需要将它们放在debian/control的二进制包部分中,其中一个以Packageexample)。这样,如果这种依赖关系不满意,Debian打包工具将拒绝安装该软件包(除非您问得很好,例如使用dpkg --force-depends --install <package name>)。

0

大量的试验和在此错误后是什么似乎工作最好暂且:

  1. 期间(后)安装时间

  2. 我做的sqlite的DB文件被生成该文件的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的安装是照顾内规则文件的通过连续调用安装-m

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