0

我正在尝试使用 Python 中的 dnf api ( docs )(即不是来自命令行)。最终,我的应用程序得到了一个 rpm 列表,它试图查询 dnf 以递归地找到它们所有依赖的 rpm。这一切都很好pkg.requires等)...query().filter(provides=...)

我遇到的问题是,我似乎无法在 dnf 正在使用的 rpm 集中包含来自模块的 rpm(包 sack?)。

该应用程序执行所有通常的初始化、回购选择、填充袋、可用列表,例如

dnf.Base.__init__(self)
self.read_all_repos()
repos = self.repos.all()
repos.disable()
repos = self.repos.get_matching('x')     # multiple of these for
repos.enable()                           # base, appstream etc
self.fill_sack(load_system_repo=False, load_available_repos=True)
q = self.sack.query().available()
for pkg in q:
  print('avail - {} - {}'.format(pkg, pkg.repoid))

打印的列表包括已启用存储库中的所有 rpm ,模块中的任何内容除外,例如启用AppStream存储库后,httpd 不包含在available()列表中,httpd 是 AppStream 中的一个模块。

如果我启用了 httpd 模块...

...
self.fill_sack(load_system_repo=False, load_available_repos=True)
module_base = dnf.module.module_base.ModuleBase(self)
module_base.enable(['httpd:2.4'])
q = self.sack.query().available()
...

... 来自它的 rpm 仍然没有出现在available()列表中?

有什么方法可以让模块 rpm 出现在available()列表中,还是我必须完全单独处理它们?例如

module_packages, nvscap = module_base.get_modules('*')
for mpkg in module_packages:
  for x in mpkg.getArtifacts():
    print('rpm {} in module {}'.format(x,mpkg.getName()))

文档非常少(通读一遍,多读几遍!),并且需要大量的点点滴滴。我花了几个小时在黑暗中摸索,但未能找到解决方案。任何线索/指针感激收到!谢谢 :-)

4

1 回答 1

0

我找到了答案。我只需要包含module_hotfixes=true在 repo def 文件 ( /etc/yum.repos.d/x.repo) 中。如此明显... :-/

于 2022-02-05T12:16:40.613 回答