OpenEuler anaconda 加载软件源流程
软件选择界面中的所有配置选项都。
·
结合这些代码文件,我来详细分析软件选择界面中配置选项的读取来源和具体代码依据:
📁 配置选项读取来源分析
1. 环境数据来源 (Environments)
代码依据:software_selection.py 中的 _refresh_environments 方法
def _refresh_environments(self):
"""Create rows for all available environments."""
self._clear_listbox(self._environment_list_box)
for environment in self._selection_cache.available_environments:
# Get the environment data.
data = self._dnf_manager.get_environment_data(environment)
selected = self._selection_cache.is_environment_selected(environment)
# Add a new environment row.
row = EnvironmentListBoxRow(data, selected)
self._environment_list_box.insert(row, -1)
关键数据流:
self._selection_cache.available_environments- 获取可用环境列表self._dnf_manager.get_environment_data(environment)- 获取具体环境数据
环境数据来源追踪:
在 SoftwareSelectionCache 初始化时:
# software_selection.py 第 67 行
self._selection_cache = SoftwareSelectionCache(self._dnf_manager)
SoftwareSelectionCache 类(在 pyanaconda/ui/lib/software.py):
class SoftwareSelectionCache:
def __init__(self, dnf_manager):
self._dnf_manager = dnf_manager
# 从 DNF 管理器获取可用环境
self._available_environments = self._dnf_manager.get_environment_ids()
@property
def available_environments(self):
return self._available_environments
2. 组数据来源 (Groups/Addons)
代码依据:software_selection.py 中的 _refresh_groups 方法
def _refresh_groups(self):
"""Create rows for all available groups."""
self._clear_listbox(self._addon_list_box)
if self._selection_cache.environment:
# Get the environment data.
environment_data = self._dnf_manager.get_environment_data(
self._selection_cache.environment
)
# Add all optional groups.
for group in environment_data.optional_groups:
self._add_group_row(group)
# Add user visible groups that are not optional.
for group in environment_data.visible_groups:
if group in environment_data.optional_groups:
continue
self._add_group_row(group)
关键数据:
environment_data.optional_groups- 可选软件组environment_data.visible_groups- 可见软件组
3. DNF 管理器数据源
代码依据:software_selection.py 中的属性
@property
def _dnf_manager(self):
"""The DNF manager."""
return self.payload.dnf_manager
DNF 管理器从以下位置读取数据:
# 在 pyanaconda/payload/dnf/manager.py 中
class DNFPayload:
def get_environment_ids(self):
"""Get all available environments."""
return self._base.environments # 来自 libdnf 的底层环境数据
def get_environment_data(self, environment_id):
"""Get data for the specified environment."""
environment = self._base.get_environment(environment_id)
return EnvironmentData(
id=environment.id,
name=environment.name,
description=environment.description,
# ... 其他属性
)
🔍 具体配置来源分析
你界面中的选项对应关系:
基本环境 (左侧) 来源:
- “默认安装” → 来自
comps.xml中的<environment id="minimal"> - “添加安装” → 来自
comps.xml中的<environment id="server"> - “CUCLoL8服务器组件” → 自定义环境,可能来自仓库的
comps.xml - “虚拟化主机” →
<environment id="virtualization-host"> - “云端主计算服务” →
<environment id="cloud-server">
附加软件 (右侧) 来源:
- “开发工具” →
<group id="development-tools"> - “云端操作系统管理工具” →
<group id="cloud-management"> - “传统UNIX兼容性” →
<group id="compatibility-libraries">
数据读取流程:
# 1. 初始化时从仓库读取环境数据
# pyanaconda/payload/dnf/manager.py
def _load_repository_data(self):
"""Load repository metadata including environments and groups."""
self._base.load_repositories() # 加载仓库
self._base.load_environments() # 从 comps.xml 加载环境
# 2. 获取环境列表
# pyanaconda/ui/lib/software.py
def get_environment_ids(self):
return list(self._dnf_manager.environments)
# 3. 获取具体环境信息
def get_environment_data(self, environment_id):
env = self._dnf_manager.get_environment(environment_id)
return EnvironmentData(
name=env.name, # 环境名称(显示在界面)
description=env.description, # 环境描述
optional_groups=env.optional_groups, # 可选组
visible_groups=env.visible_groups # 可见组
)
📊 配置文件的物理位置
主要配置文件来源:
# 1. 仓库中的 comps.xml 文件
/run/install/repo/repodata/*comps.xml
/run/install/repo/repodata/*comps-*.xml
# 2. 系统预定义的环境
/usr/share/anaconda/payloads/rpmostreepayload/environments/
# 3. DNF 缓存的环境数据
/var/cache/dnf/*/repodata/*comps.xml
comps.xml 文件结构示例:
<!-- 环境定义 -->
<environment>
<id>minimal</id>
<name>默认安装</name>
<description>默认功能。</description>
<grouplist>
<groupid>core</groupid>
<groupid>base</groupid>
</grouplist>
</environment>
<environment>
<id>virtualization-host</id>
<name>虚拟化主机</name>
<description>虚拟化主机。</description>
<grouplist>
<groupid>virtualization-host</groupid>
<groupid>core</groupid>
</grouplist>
</environment>
<!-- 组定义 -->
<group>
<id>development-tools</id>
<name>开发工具</name>
<description>基本开发环境。</description>
<packagelist>
<packagereq>gcc</packagereq>
<packagereq>gdb</packagereq>
</packagelist>
</group>
🔄 完整的数据流路径
仓库 comps.xml 文件
↓
DNF 包管理器加载元数据
↓
pyanaconda/payload/dnf/manager.py
↓
SoftwareSelectionCache 缓存数据
↓
software_selection.py 界面逻辑
↓
EnvironmentListBoxRow/GroupListBoxRow 显示组件
↓
GTK 界面渲染
🎯 关键代码调用链
环境数据显示:
# software_selection.py 第 229-238 行
for environment in self._selection_cache.available_environments:
data = self._dnf_manager.get_environment_data(environment)
# → 调用 pyanaconda/payload/dnf/manager.py 的 get_environment_data()
# → 从 libdnf.Environment 对象获取 name, description
row = EnvironmentListBoxRow(data, selected)
# → 在 pyanaconda/ui/gui/spokes/lib/software_selection.py 中渲染
组数据显示:
# software_selection.py 第 249-265 行
for group in environment_data.optional_groups:
self._add_group_row(group)
# → 调用 _add_group_row() 方法
data = self._dnf_manager.get_group_data(group)
# → 从 libdnf.Group 对象获取组信息
row = GroupListBoxRow(data, selected)
# → 渲染组行
💡 总结
软件选择界面中的所有配置选项都从软件仓库的 comps.xml 文件读取,通过以下路径:
- DNF 包管理器加载仓库元数据
- SoftwareSelectionCache 缓存环境/组数据
- software_selection.py 处理界面逻辑
- GTK 组件渲染显示
具体的环境名称、描述、可选软件组等信息都定义在对应 Linux 发行版的 comps.xml 文件中,Anaconda 只是读取和显示这些预定义的内容。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)