openSUSE:打包品牌
发行版品牌化和支持品牌化的软件包
发行版品牌化的目的
为了能够在不重新构建任何二进制软件包的情况下更改发行版的界面,我们需要一种单独提供软件包品牌化的方法。
这些约定应该允许以下操作
- 轻松替换所有品牌化内容。
- 确定发行版中使用的品牌化,以检查所有内容是否已正确品牌化(例如,
rpm -qa '*-branding*' | grep -v openSUSE在 openSUSE 发行版上应该为空)。 - Joe 喜欢在 openSUSE 上创建一个名为“Flocke”的发行版,并希望将所有绿色的 SUSE 蜥蜴替换为白色的北极熊。
- SUSE 喜欢发布基于 openSUSE 的发行版,作为 SUSE Linux Enterprise Server。Frederic 的任务是将所有“openSUSE”替换为“SUSE Linux Enterprise Server”。
- Tara 喜欢 openSUSE 各种项目的上游品牌化,不喜欢看到 openSUSE 徽标。她想更改她的系统,并以一种简单的方式替换自定义品牌化。
支持品牌化的软件包的描述
支持品牌化的软件包在单独的软件包中提供其品牌化。
此技术适用于
- 提供自定义品牌化图像。
- 提供自定义默认书签、订阅源、频道、桌面图标、主页。
支持品牌化软件包的打包规则
- 品牌化图像应存在于单独的文件中。
- 不将自定义品牌化图像添加到软件包中。
软件包维护者应拆分为两个子软件包 - 一个包含核心文件(foo),一个包含上游提供的品牌化(foo-branding-upstream)。这些软件包通过版本依赖关系连接。
品牌化和主题
有两种可能的方式来定制软件包的外观和感觉 - 品牌化和主题。在以下建议中,品牌化是一个排他性的软件包,它与其他所有相关的品牌化软件包冲突。主题是一个软件包或一组文件,其中包含软件包外观和感觉的非排他性描述。
同时,可以安装更多主题,但只能安装一个品牌化。在这种概念中,可主题化软件包的品牌化是默认主题的定义。
约定
软件包名称
所有品牌化软件包名称应由三个部分组成 - 软件包核心名称、字符串 "-branding-" 和品牌化名称。默认情况下会创建一个特殊的品牌化名称:“upstream”。这是上游提供的品牌化(如果存在)。
非冲突的主题软件包应由三个部分组成 - 软件包核心名称、字符串 "-theme-" 和主题名称。
Spec 文件注释
每个文件都应包含提供足够信息的注释供艺术家使用。您可以期望上游品牌化可供艺术家使用。
这些注释的每一行都应以 "#BRAND: " 字符串开头,后跟以下信息
- spec 源代码文件名(必需)。Spec 源代码软件包文件名应在整个发行版中唯一。例如,如果目标文件名是 /usr/share/foo/splash/image.png,则源代码软件包文件名应为 foo-splash-image.png,并且应在 %install 阶段复制到正确的目标位置。
- 用例(必需,如果它不是文件名的组成部分,例如“about” - 关于对话框的装饰,“splash” - 应用程序启动时显示的图像,“toolbar” - 工具栏中的图像,“初始屏幕” - 应用程序启动时显示,用户开始使用之前)。
- 所需的艺术作品(如果图像应包含程序名称字母、分支编号,所需的 logm 注释应说明需要包含的内容)。
- 叠加层(如果图像在图像上叠加任何文本,注释应说明其大小、颜色和位置)。
- 依赖项(如果可以使用另一个文件自定义外观,则必须提及它)。示例:“foo-img1.png 的宽度必须与 foo-bg.png 的宽度相同。” “您可以在 splash.xml 中定义叠加文本颜色、大小和位置。”
- 允许的文件大小(可选,如果未提供,艺术家必须遵循上游大小)。
- 允许的文件格式(可选,如果未提供,艺术家必须遵循上游文件格式)。
- 对于启动器图标的品牌化,建议创建自定义图标主题而不是品牌化。
注意:如果软件包支持品牌化,但默认外观和感觉不需要任何文件,则不会创建上游品牌化。但是,鼓励软件包维护者创建 spec 文件注释,描述创建第三方品牌化的方法。
品牌化软件包版本依赖关系
定义正确的版本依赖关系
从版本到版本,软件包开发人员可能会决定更改图像的大小和类型。另一方面,这不会发生在每个版本更新中,并且不需要强制更新品牌化软件包。假设版本 n 具有与先前版本 n-1 不兼容的品牌化,而当前版本是 n+1,它与版本 n 的品牌化兼容。那么依赖关系应如下所示
foo.spec:
Version: n+1 # Verify, that the branding package is new enough: Requires: foo-branding >= n
如果软件包可以在没有品牌化的情况下工作,则可以将 Requires 替换为 Recommends 或完全删除此部分。
foo-branding-myvendor.spec:
Provides: foo-branding = %{version}
# Do not allow to use this branding with incompatible old version:
Conflicts: foo < n
软件包维护者负责选择正确的版本。请注意,不仅上游更改,而且打包更改也可能导致品牌化软件包不兼容。
品牌化补充
每个品牌化软件包应使用 packageand 形式补充品牌化主软件包和核心软件包的结合。它允许在可用更多品牌化软件包并且仅安装核心软件包时选择正确的品牌化软件包。品牌化补充符号由 "branding-" 字符串和品牌化的符号名称组成。上游品牌化的符号名称是 "upstream"。
foo-branding-myvendor.spec:
Supplements: packageand(foo:branding-myvendor)
如果您的品牌化软件包应为包装时已知名称的更多不同品牌化选择,则可以提供多个 Supplements 行。
品牌化软件包排他性
要定义一个品牌化软件包与其他为相同软件包提供品牌化的品牌化软件包的文件冲突,请使用引用主品牌化虚拟的 otherproviders 冲突形式
foo-branding-myvendor.spec:
Conflicts: otherproviders(foo-branding)
品牌化主软件包
品牌化主软件包或模式提供可解析的 branding-myvendor。该软件包提供虚拟符号 branding。
品牌化主软件包应在当前 Tumbleweed 的 /usr/etc/SUSE-brand 或 openSUSE Leap 15.x 的 /etc/SUSE-brand 中包含一个文件。该文件应由两行或三行组成
- 第一行是品牌的名称
- 第二行是带有 "
VERSION =" 和版本字符串的版本。 - 可选的第三行定义允许的替代品牌化 "
CO-BRANDS =" 和空格分隔的品牌化列表(只需要软件包名称的主部分)。顺序很重要。
从 openSUSE 版本派生品牌化主软件包版本很方便。
保留的品牌化名称
官方 openSUSE 品牌化软件包使用品牌化名称 openSUSE。
官方品牌化软件包通用于所有 SUSE Linux Enterprise 变体,使用品牌化名称 SLE,SUSE Linux Enterprise Server 特定品牌化使用名称 SLES,SUSE Linux Enterprise Desktop 使用品牌化名称 SLED。
为上游软件包的一部分的品牌化文件保留了特殊名称:upstream。
第三方品牌化软件包不使用源自 SUSE 商标的字符串,而是发明自己的名称。如果他们只想创建部分品牌化(例如,用于自定义),他们可以将上述名称作为 CO-BRANDS 使用。
示例
支持品牌化的软件包
foo.spec:
Version: 2.5 Requires: foo-branding >= 2.4 %package branding-upstream Supplements: packageand(foo:branding-upstream) Provides: foo-branding = 2.5 Conflicts: otherproviders(foo-branding) Conflicts: foo < 2.4 #BRAND: foo-splash.png: png or jpg file, 300x400 pixels. Progress bar #BRAND: will be displayed in lower 24 pixels. Image should include #BRAND: package name "FOO" and version letters "2.4". #BRAND: foo-info.png: Background of about dialog. Black names will #BRAND: appear in the light stripe in the centre.
品牌化软件包
foo-branding-myvendor.spec:
Version: 2.5 Supplements: packageand(foo:branding-myvendor) Provides: foo-branding = 2.5 Conflicts: foo < 2.4 Conflicts: otherproviders(foo-branding)
品牌化主软件包
branding-Flocke.spec:
Version: 11.0.2 Provides: branding Conflicts: otherproviders(branding)
请注意,可解析的 branding-Flocke 由软件包名称提供,因此不需要显式提及它。
/etc/SUSE-brand 文件来自 branding-Flocke 软件包
Flocke VERSION = 15.1 CO-BRANDS = upstream
第三行表示,如果 Flocke 品牌化的一些软件包不可用,则 branding-tool 应该选择上游品牌化作为替代品。
GNOME 2 软件包品牌化(已弃用)
使用 GConf 及其配置后端的软件包可以使用软件包 gconf2-branding-myvendor 提供在一个捆绑包中所需的所有默认值。所有这些设置可以使用单独的供应商目录 /etc/gconf/gconf.xml.vendor。
创建此软件包有两种可能的方式
- 使用
gconftool-2命令进行标准打包工作(参见gconf2-branding-openSUSE软件包)。 - 使用 SUSE 版本 gconf-editor 中的供应商默认值,然后打包
/etc/gconf/gconf.xml.vendor目录。
品牌化和主题
如果软件包支持主题,则品牌化是默认主题的定义。在这种情况下,可能存在两个软件包:foo-theme-myvendor,它将定义供应商提供的主题或主题,以及 foo-branding-myvendor,它将 foo-theme-myvendor 中定义的一个主题设置为默认值并需要此软件包。
供应商可以决定将这两个软件包合并到一个名为 foo-branding-myvendor 的软件包中。在这种情况下,供应商提供的所有主题只能在其中一个主题也被选为默认值时使用。
品牌化捆绑包的问题
从特定的品牌化软件包创建品牌化捆绑包在技术上是可行的。
但这种捆绑包会导致几个重要问题
- 品牌化捆绑包可能会将用户锁定到某些软件包的确切版本。
- 需要品牌化更新的可能的安全更新将被阻止,直到品牌化捆绑包更新为止。
迷你捆绑包
有时,将几个品牌化或主题打包到一个迷你捆绑包中很有用(例如,创建所谓的元主题)。在这种情况下,使用最低级别的软件包命名此软件包是一种很好的做法。如果您决定使用另一个名称,请确保它采用 "*-branding-" 或 "*-theme-*" 的形式,以便品牌化工具能够找到它们。
孤立的品牌化软件包
上述依赖方案可能会导致用户删除软件包时出现孤立的品牌化软件包。可能的解决方案
- 在品牌化软件包中添加循环依赖关系到主软件包。
- zypper 中的专用代码。
部分品牌化和选择第二顺序的软件包
供应商可以决定仅提供部分品牌化。确定应该选择哪个软件包作为其他可用软件包中的第二顺序并不清晰。可能的解决方案
- libzypp 的传入版本中的存储库顺序功能(请注意,这不会帮助更新存储库,其中包含更多产品的其他品牌化)。
请注意,第二级提供相同信息的是 /etc/SUSE-brand 文件中的 CO-BRANDS 行。 CO-BRANDS 的顺序应与存储库的顺序一致。
由于 SUSE-brand 只是一个文本文件,因此您可以确保通过以下方式安装正确的品牌化
假设您有一个 branding-Flocke 软件包和一组 Flocke 品牌化软件包。但是您没有 gimp-branding-Flocke 软件包。您想安装 gimp-branding-Polarbear 代替。要完成此任务,您可以将以下行添加到 branding-Flocke.spec
Suggests: gimp-branding-Polarbear
这将建议在安装期间选择该软件包。
如果 gimp-branding-Polarbear 软件包在您的控制之下,您应该将以下行添加到 gimp-branding-Polarbear.spec
Supplements: packageand(gimp:branding-Flocke)
部分品牌化和软件包替换
当供应商拥有一组有限的品牌包,然后想要为另一个包提供品牌时,可能存在问题。此时,次序在前的品牌已经安装。可能的解决方案
- 使用
Obsoletes: foo-branding-second_in_order - 等待发行版更新,并在 libzypp 的新版本中使用仓库顺序功能