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