构建仅针对单个Ubuntu发行版的程序包的最佳方法是什么?

目前,我通过dpkg-buildpackage为Ubuntu 14.04构建和打包我们的软件,即’trusty’。 我得到一个.deb包,可以安装在Ubuntu 14.04上,也可以安装在其他Ubuntu版本上,例如12.04又称’精确’。 这很危险,因为可以在没有错误消息的情况下安装软件,但程序无法正常运行/工作。

我的包的依赖关系在control文件中给出。 但是这个文件不允许我输入Ubuntu的发行版/代号。 分发可以作为*.changes一部分输入,但不会反映在.deb文件中的任何位置。 在安装后脚本期间检查复杂的依赖关系情况也很复杂。 因此,我想要一种简单的方法来防止在错误的Ubuntu版本上安装Ubuntu软件包。

构建仅针对单个Ubuntu发行版的程序包的最佳方法是什么? 在最好的情况下(1),安装应仅适用于目标Ubuntu版本,(2) .deb包中包含分发名称*,例如package_1.0.0-3_trusty_amd64.deb

(*)否则,通过reprepro管理的apt存储库不能有两个具有相同版本号的软件包,每个软件包都针对不同的Ubuntur版本。

提前致谢。

更新:

我的包的debian/control文件:

 Source: mypackage Priority: extra Build-Depends: debhelper (>= 9), python (>=2.7), pyside-tools X-Python-Version: >= 2.7 Standards-Version: 3.9.2 Package: mypackage Architecture: amd64 Depends: ros-indigo-desktop-full|ros-hydro-desktop-full, ros-indigo-rqt|ros-hydro-rqt, ros-indigo-gps-umd|ros-hydro-gps-umd, ros-indigo-map-server|ros-hydro-map-server, imagemagick, octave (>= 3.6), libdc1394-22, sox, tree, python (>=2.7), python-psutil, python-usb, python-serial, python-gi, gir1.2-gexiv2-0.10|gir1.2-gexiv2-0.4, exfat-fuse|fuse-exfat, exfat-utils, gphotofs, python-pyproj, libusb-1.0-0 (>=2:1.0.17), libpyside1.2|libpyside1.1 (>=1.1.2), ${shlibs:Depends}, ${misc:Depends} Description: ... 

可以看到,这个控制文件已经过调整,我们可以在多个Ubuntu版本上运行构建,其中依赖项具有不同的版本号: libpyside1.2|libpyside1.1 (>=1.1.2) 。 有没有更好的方法来处理这个?

  • 因为,您的软件包安装在它无法使用的发行版/环境中,这意味着您的软件包control缺少某些内容的依赖项。

    我希望您没有放置依赖版本条件,如果依赖版本仅在该版本中可用,可以用来让软件包安装在单个版本上,例如gedit: gedit-common (>= 3.10), gedit-common (<< 3.11)

     Depends: libatk1.0-0 (>= 1.12.4), libc6 (>= 2.14), libcairo2 (>= 1.2.4), libenchant1c2a (>= 1.6.0), libgdk-pixbuf2.0-0 (>= 2.22.0), libgirepository-1.0-1 (>= 0.9.3), libglib2.0-0 (>= 2.38), libgtk-3-0 (>= 3.10), libgtksourceview-3.0-1 (>= 3.10.0), libpango-1.0-0 (>= 1.14.0), libpeas-1.0-0 (>= 1.1.0), libx11-6, libxml2 (>= 2.7.4), libzeitgeist-2.0-0 (>= 0.9.9), gedit-common (>= 3.10), gedit-common (<< 3.11), gsettings-desktop-schemas, python3-gi (>= 3.0), python-gi-cairo (>= 3.0), gir1.2-peas-1.0, iso-codes Recommends: gir1.2-gtksource-3.0, zenity, yelp Suggests: gedit-plugins Breaks: gedit-plugins (<< 2.91) 

    参考: Debian政策手册:第7章 - 声明包之间的关系

  • 使用preinst脚本和lsb_release命令的另一种方法:

     #!/bin/sh set -e release=$(lsb_release -cs) if [ ! "$release" = "trusty" ] then echo "This packages wasn't build for your release." echo "Package wasn't installed, See ..." exit 1 fi exit 0 

    如果您希望在构建时定义trusty ,则可以将模板设置为preinst.in并编写makefile以在构建源时执行变量替换。

在Debian软件包中,没有办法说“仅允许14.04上的安装”。 这必须发生在apt存储库级别(我将在稍后介绍)。 对此的半例外是因为Trusty比Precise更新,Trusty会重命名一些库包(只要用户不使用提供这些包的PPA,就会使它们可以卸载)并且会有更新的版本库, dh-shlibdeps 可以 dh-shlibdeps添加版本要求。 因此,在这两种情况下,包都将在Precise中卸载。 请注意,为Precise构建的软件包可能可以安装在Trusty中。

对于apt存储库,包每个版本都有一个单独的debian版本号。 您描述的格式可以使用,虽然使用~更常见,部分原因是~比所有其他字符少,因此如果用户升级到较新的版本(例如从Precise到Trusty),并且该软件包存在于官方repos(版本号为1.0.0-3 ,然后用户将从1.0.0-3~precise1升级到1.0.0-3 ,即使你有1.0.0-3~trusty1 。这不会如果你使用任何其他字符,请使用。我个人使用类似1.0.0-0ubuntu1~ppa1~precise1 ; ~ppa1部分是为了使它比将来可能出现的任何官方Ubuntu软件包少,而且~precise1部分是指定发布。其他PPA维护者可以使用1.0.0-3~12.04.11.0.0-3~14.04.1 ,指定版本号而不是代号,这保证会增加(只要Ubuntu版本号不重置)。

请注意,二进制包具有相同的源包,因此您需要确保.changes文件不包含源包。