所以我有一个本地 ubuntu repo 服务器来提供软件包。
apt-cache search custompkg – 显示包。
通过 apt-get install custompkg 安装后,我无法通过 apt-get changelogs custompkg 查询该软件包的更改日志。
收到的错误是:
E: Failed to fetch changelog:/custompkg.changelog Changelog unavailable for custompkg
我可以通过以下方式查看变更日志:less /usr/share/doc/custompkg/changelog.Debian.gz
但是我如何才能使它与 apt-get changelog 命令一起工作?我看到它延伸到 changelogs.ubuntu.com,并且 repo 设置看起来与常规 ubuntu repo 非常相似。
我可以使用什么工具/如何从本地变更日志服务器制作 apt-get 查找变更日志?
我看到 /etc/apt/conf.d 中有一个选项 -
cat 01-vendor-ubuntu
Acquire::Changelogs::AlwaysOnline "true";
但是,关于如何将其指向本地变更日志服务器以及如何进行设置的文档并不多。
任何指导都值得感激。
答案1
详细说明
据我对 APT 内部结构的了解,变更日志服务器需要明确配置。我为此使用了 reprepro,并将以此为基础进行回答,因为问题中没有明确提到这一点,但无论您使用什么工具,都应该有类似的概念。
APT 在 下有设置Acquire::Changelogs::URI::
。APT 知道如何从官方 Debian 和 Ubuntu 存储库中的软件包获取更改日志的方式在 APT 代码中设置如下:
apt-pkg/init.cc:208: Cnf.CndSet("Acquire::Changelogs::URI::Origin::Debian", "https://metadata.ftp-master.debian.org/changelogs/@CHANGEPATH@_changelog");
apt-pkg/init.cc:209: Cnf.CndSet("Acquire::Changelogs::URI::Origin::Ubuntu", "https://changelogs.ubuntu.com/changelogs/pool/@CHANGEPATH@/changelog");
还要注意Origin
。这将是您Release
的 apt 服务器上发行版文件中的一个字段(默认为空白)。您还可以将其设置为依赖于例如字段Label
。阅读文档,似乎您还可以Changelogs
在Release
文件中设置一个字段,但实际上这似乎不是主要发行版的做法,我也无法找到使用 reprepro 来做到这一点的方法,所以我假设您从现在开始设置Origin
为。Custom
注意@CHANGEPATH@
替换变量。替换方式与 下的软件包相同pool
。因此,如果您在具有 架构 的组件中有一个foo
版本的软件包,APT 将首先在 下查找该软件包。组件名称下的目录的算法是,任何以 开头的软件包都会被放入以其名称的前 4 个字母为前缀的目录中(将放在 下),而任何其他软件包仅使用第一个字母(放在 下)。1.0.0-1
main
all
/pool/main/f/foo/foo_1.0.0-1_all.deb
lib
libfoo
libf/libfoo/
foo
f/foo/
类似地,如果您例如创建文件/etc/apt/apt.conf.d/10-vendor-custom
(在目标计算机上,而不是服务器上),其内容如下:
Acquire::Changelogs::URI::Origin::Custom "https://customrepo.dev/changelogs/pool/@CHANGEPATH@/changelog";
如果您随后更新 APT 并运行apt changelog foo
,APT 将会在 处寻找变更日志https://customrepo.dev/changelogs/pool/main/f/foo/foo_1.0.0-1/changelog
。
现在,无论您使用什么工具,您都应该能够弄清楚如何配置 APT 服务器以在每次上传软件包时生成此信息,但是如果您使用 reprepro,则已经包含一个(文档记录不太好的)工具。它位于 下/usr/share/doc/reprepro/examples/changelogs.example.gz
。复制该文件并在您的conf/
目录下解压,然后将以下行添加到您conf/distributions
要为其启用更改日志的发行版的文件中:
Log:
--type=dsc changelogs.example
reprepro 应该会自动在 下为你添加变更日志changelogs/pool/
。你可以运行reprepro rerunnotifiers
来为所有已上传的软件包生成变更日志。
一步步
假设以下情况:
- 使用 reprepro 管理服务器上的包
- 在下
conf/distributions
,该Origin
字段设置为Custom
- repo 托管于
https://customrepo.dev
- 您希望在同一台服务器上托管变更日志,但不想做任何花哨的事情
- 目标机器已经配置为从 repo 中提取实际软件包
/etc/apt/apt.conf.d/10-vendor-custom
首先在目标机器上添加以下内容的文件:
Acquire::Changelogs::URI::Origin::Custom "https://customrepo.dev/changelogs/pool/@CHANGEPATH@/changelog";
其次,转到存储库的基本目录并运行以下命令:
cp /usr/share/doc/reprepro/examples/changelogs.example.gz conf/
gunzip conf/changelogs.example.gz
chmod 755 conf/changelogs.example
printf "Log:\n --type=dsc changelogs.example\n" >> conf/distributions
之后再仔细检查,您的指令和您尝试配置的分发的上述指令conf/distributions
之间不应该有任何空行,但这应该是您所需要的。Log:
运行reprepro rerunnotifiers
以生成所有当前源包的更改日志。您添加的任何新包都应自动包含在内。这应该是您需要的所有配置。