openSUSE:Libzypp 应用层

跳转到:导航搜索
本文档描述了 libzypp(软件管理后端)、UI(用户界面;YaST Qt/NCurses/Gtk UI 和 zypper)以及它们之间的胶合代码的作用和交互。它还考虑了对流行脚本语言(目前:Perl、Python、Ruby)的绑定。

摘要

本文档描述了 libzypp(软件管理后端)、UI(用户界面;YaST Qt/NCurses/Gtk UI 和 zypper)以及它们之间的胶合代码的作用和交互。它还考虑了对流行脚本语言(目前:Perl、Python、Ruby)的绑定。

角色和术语

libzypp

libzypp 被设计为一个用于包管理的通用库。作为一个库,libzypp 不应该具有内置的应用业务逻辑。它不应该对数据处理方式做出过多的假设,也不应该基于这些假设对使用它的应用程序施加任何限制。

UI

“UI”(“用户界面”)这个术语在之前的关于 libzypp 的讨论中以相当模糊的方式使用。它既用于指用户可见的前端,也用于指应用层。

在本文档中,“UI”指的是以下任何一种:

  • YaST 包选择器小部件,Qt/NCurses/Gtk UI 工具包,包括其变体,如补丁选择器或模式选择器
  • zypper
  • 语言绑定
    不一定是一个 UI,但广义上来说是一个应用程序。

在非常有限的程度上,“UI”还包括使用包选择器小部件(sw_single.ycp)和处理仓库的 YaST 对话框。

重要的是要注意,包选择器小部件也是一个通用库的一部分:YaST UI。因此,它们不能存储任何比其对话框可见时间更长的任何信息,因为该库中也没有应用层。

应用层

应用层(或“app 层”)是连接两个极端:libzypp 和 UI 的胶合代码。它可以独立存在,但为了便于处理,它一直是 libzypp 中的一个附加组件,位于一个单独的目录 libzypp/ui 中。

libzypp/app 会是一个更合适的名字,但一致地更改它意味着需要对使用它的现有代码进行大量更改。也就是说,libzypp/app 可以在内部存在以实现非严格的用户界面相关的胶合代码。

数据存储

UI(特别是包选择器小部件)不能存储任何比其对话框在屏幕上可见时间更长的任何信息。特别是,它们不能初始化任何对 zypp 池等事物或仓库的句柄。此类信息的使用寿命需要与调用应用程序的活动时间一样长,这比这些小部件可见的时间要长得多。

在现有代码中,YCP 应用程序设置仓库,从而初始化 zypp 对象,如包含 zypp 对象(如可解析对象等)的池。即使 libzypp 可以处理任意数量的池,但对于应用程序而言,始终只有一个池。

YCP 应用程序和 C++ 包选择器小部件之间的通信非常有限(几乎不存在)。特别是,YCP 应用程序不能创建一个池并将该池的句柄传递给 C++ 包选择器,反之亦然。

因此,对于所有重要的对象,如池或类似对象,必须为每个对象创建一个单例对象,以便可以从 YCP 代码(通过包绑定)和包选择器中轻松访问。这些单例对象应该位于应用层。

可选项

更高级的对象:模式、补丁、语言

过滤器视图和查询

杂项

API 提案