创建具有同一个软件包的多个版本的 deb 软件源。

我想创建自己的deb软件包存储库来存储一些软件包。我已经尝试了reprepro,它工作得很好,除了一个基本功能。Reprepro无法在存储库中存储同一个软件包的多个版本。

对我来说,能够存储同一个软件包的多个版本是必不可少的,所以我想知道有哪些软件可以做到这一点。

下面是reprepro FAQ的一部分,显示它无法实现这个功能:

3.1) Can I have two versions of a package in the same distribution?
-------------------------------------------------------------------
Sorry, this is not possible right now, as reprepro heavily optimizes
at only having one version of a package in a suite-type-component-architecture
quadruple.
You can have different versions in different architectures and/or components
within the same suite. (Even different versions of a architecture all package
in different architectures of the same suite). But within the same
architecture and the same component of a distribution it is not possible.
6个回答

据我所了解,当添加软件包时,mini-dinstall需要debian的.changes文件。由于我只有.deb文件可用,我发现aptly也支持多个版本。
另一个更轻量级的选择是freight,它是一组用于维护debian仓库的shell脚本。自2017年以来,我已经使用freight三年来维护一个小型但活跃更新的仓库,并取得了良好的结果。其中一个关键功能是能够保留多个版本的软件包。
编辑:将链接更新为新的freight仓库,因为之前的仓库自2014年以来没有更新。

1给个差评的人:能详细解释一下吗? - bohrax
1请注意,freight已经被分叉并且现在正在https://github.com/freight-team/freight上进行维护 - 原始版本自2014年以来没有更新。 - Wolfgang
@Wolfgang谢谢,已经在答案中更新了链接! - bohrax

解决方法是使用mini-dinstall来管理Deb仓库。它不会从仓库中删除先前版本的软件包。

2只有在mini-dinstall.conf中设置"keep_old = 1"时,才会出现这种情况。根据man页面和最近的经验,默认情况下会删除旧版本。已测试通过0.6.29ubuntu1版本。 - pendor


不确定为什么这个回答被踩,除非是因为它缺乏细节。货运确实看起来是一个可行的替代 reprepro 的选择,我打算尝试一下,因为我和楼主有同样的需求。 - killthrush
我不是那个给你点踩的人,但可能是因为一年前我在回答中已经提到了货运。无论如何,我可以担保它是一个可行的选择。我已经使用它超过一年了,用于一个小型但活跃更新的代码库。不过我们也遇到了这个问题:https://github.com/rcrowley/freight/pull/65 - bohrax
1@bohrax: 看起来 freight 已经被分叉并且现在在 https://github.com/freight-team/freight 上进行维护。 - Wolfgang

如果您愿意手动编写 Packages 文件(例如使用自定义脚本),则可以将同一软件包的多个版本放入其中,然后使用语法 apt-get 安装特定版本。
apt-get install packagename=version

你可以通过这个包获取所有你需要写作的信息。
dpkg-deb --info package.deb

并且

md5sum package.deb

apt-get upgrade 也会选择最高版本号(至少在我的有限测试中是这样的)。

谢谢你的回答,但我更喜欢使用一些能够生成Packages文件的系统。 - bessarabov
这并没有回答关于如何创建一个包含多个版本的软件包仓库的问题。这是对另一个问题的回答。 - gertvdijk

我意识到我来晚了 :D

但是当我看到这个问题时,我觉得值得回答,以防有人在关注。

答案是:不行,reprepro不能在一个仓库(例如focal-stable)中拥有同一个软件包的多个版本。

对于像我这样负责管理仓库的人来说,这非常好,因为它消除了需要“清理”或给客户带来困惑的需求。


正如软件所告诉您的那样,当新版本出现时,旧版本就会被清除。通常,这是通过多个仓库来实现的。就像Ubuntu和Debian为稳定版和不稳定版或Natty、Oneiric等都有多个仓库一样,您也需要拥有多个仓库。
通常,包管理器会选择最新版本的软件包,因此对于用户来说也很难进行选择。

1创建多个仓库并不能解决我的问题。我需要将同一个软件包的多个版本放在同一个仓库中。对于那些对我为何需要这样做感兴趣的人,这里有一个帖子详细解释了原因:https://answers.launchpad.net/launchpad/+question/171452 - bessarabov
我担心你必须从不同的角度来看待你的问题,因为常规的Debian软件仓库不支持多个版本。 - Martin Ueding
2你是不对的。请查看常规的 Debian 软件仓库 http://ftp.us.debian.org/debian/pool/main/p/perl/,你会发现同一架构下有几个版本的相同软件包。 - bessarabov