构建仅针对单个 Ubuntu 版本的软件包的最佳方法是什么?

构建仅针对单个 Ubuntu 版本的软件包的最佳方法是什么?

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

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

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

(*) 否则,通过 apt 存储库管理的软件包reprepro不能具有相同版本号的两个软件包,每个软件包都针对不同的 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)。有没有更好的方法来处理这个问题?

答案1

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

至于 apt 存储库,软件包的每个版本都有一个单独的 debian 版本号。您描述的格式可以工作,尽管使用~更常见,部分原因~是小于所有其他字符,因此如果用户升级到较新的版本(例如从 Precise 到 Trusty),并且软件包存在于官方存储库中(版本号为1.0.0-3,则用户将从升级1.0.0-3~precise11.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文件不包含源包。

答案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 来在构建源时进行变量替换。

相关内容