如果我手动升级一个 apt-tracked 软件包会发生什么情况?

如果我手动升级一个 apt-tracked 软件包会发生什么情况?

我在 Ubuntu 服务器 22.04 (Jammy) 上。

我仍然是一个 Ubuntu 新手,我想安装apt upgrade一个我之前通过相关 PPA 安装的软件包apt。结果我做不到,apt 看不到最新版本。原因是 PPA 背后的团队未能成功构建最新版本,并且apt从逻辑上讲,他们认为我拥有的是最新版本,因为较新版本的构建失败了。

更新非常重要,所以我想通过项目 Github 提供的二进制文件手动安装/升级包。我的意思是下载.tar.gz项目团队提供的。

之后软件包会怎样?apt 会继续跟踪单独的版本吗?apt 会拒绝更新我手动升级的内容吗?我会不会弄巧成拙,最终得到同一个软件包的两个实例?

任何信息,将不胜感激。

答案1

您需要从包管理器的角度来思考。包管理器具有本地数据库,用于跟踪包、版本及其文件。因此,它查看“升级”的唯一方法是在数据库中增加版本。您可以在不更改任何包内容的情况下执行此操作,在这种情况下,您会“伪造”升级,因为包文件仍然是较旧的。

从您提到的tar.gz文件来看,您可能想从源代码编译包并用您构建的文件覆盖二进制文件。在这种情况下,它会工作一段时间,但随后更新将覆盖文件。更糟糕的是,如果您运行ninja/make install而不是复制几个文件,您的系统中可能会出现未跟踪的文件,这又是一个麻烦。

话虽如此,只要你从源代码编译软件没有问题(我假设你没有,因为你提到与合作tar.gz,制作一个.deb包非常简单。基本上,你:

  1. 创建一个control文件,描述软件包名称、版本以及您想要的任何内容。不要忘记将较新的版本放在那里,以便软件包管理器知道在远程 repo/PPA 中出现较新的版本之前不要更新软件包。
  2. 执行一个ninja/make installDESTDIR覆盖到你要组装包的目录的绝对路径
  3. 调用 afakeroot dpkg-deb --build "/foo/bar/package-dir" my-cool-pkg.deb来组装my-cool-pkg.deb文件

然后你调用 asudo apt install ./my-cool-pkg.deb来安装它。

笔记:不要使用 root/sudo 来组装软件包。如果你需要它,那你就做错了。你只需要它在之后安装软件包。

示例:下面是我用来创建 git 版本的脚本rr 实用程序,一个允许记录进程执行以便稍后在 gdb 中重放的框架:

#!/bin/bash
# NOTE: make sure the rr build is configured with --prefix=/usr/. It is
# important, so libraries upon installation end up in correct locations.
set -e

if [ "$#" -ne 1 ]; then
    echo "Wrong number of parameters.
Usage: $(basename $0) build_dir"
    exit 1
fi

BUILD_ROOT=$(readlink -f $1)
PKG_DIR="$BUILD_ROOT"/deb
PACKAGE_VERSION="5.7.0~$(git rev-parse HEAD)"
mkdir -p $PKG_DIR/DEBIAN/
cat > $PKG_DIR/DEBIAN/control <<- END_OF_TEXT
PACKAGE: rr-git
Version: $PACKAGE_VERSION
Architecture: amd64
Maintainer: Mystique Packager
Description: application execution recorder, player and debugger
Depends: libcapnp-0.7.0
Conflicts: rr
Provides:  rr
Homepage: https://github.com/rr-debugger/rr
END_OF_TEXT

cd "$BUILD_ROOT"
DESTDIR="$PKG_DIR" ninja install

# Work around a bug that rr doesn't find lib when installed to standard location.
# Should be fixed in rr actually.
mv "$PKG_DIR"/usr/lib/x86_64-linux-gnu/rr "$PKG_DIR"/usr/lib/
rmdir "$PKG_DIR"/usr/lib/x86_64-linux-gnu

fakeroot dpkg-deb --build "$PKG_DIR" rr_$PACKAGE_VERSION.deb

您可以使用此脚本作为基础,为您想要的任何内容创建 deb 包。您可以删除文件中的大部分字段control,因为您可能只需要PACKAGEVersion字段,Depends如果您愿意,也许还需要。

相关内容