openSUSE:打包 XML 模式和样式表
打包 XML 模式和样式表 是一个循序渐进的介绍,说明如何为 openSUSE 构建软件包,这些软件包使用 openSUSE 构建服务 支持 XML 目录。
目的
本页旨在定义一组用于打包具有公共 URI 或标识符的 XML 模式和样式表的通用规则。
XML 目录
以路径方式访问资源可能会给您带来一些问题
- 路径依赖于平台(比较/usr/share/xml/为C:\Program\...)
- 某些(旧版)操作系统不区分大小写路径。
- 路径可能会更改
XML 目录解决了这些问题。它们旨在作为 URI 和本地路径之间的“映射表”。使用 XML 目录,您可以获得以下好处
- 速度:您不会每次处理 XML 文档时都下载资源,而是重定向到本地路径。
- 可交换性:它使在不同操作系统之间的交换更容易,因为您可以依赖于通用的 URI。
- 集中化:使用 XML 目录,您拥有一个集中配置通用 URI 的地方
例如,DocBook V4.5 的官方公共标识符是"-//OASIS//DTD DocBook XML V4.5//EN"。但是,这是一个标识符,它没有定义 DTD 的实际存储位置。要获取实际路径,请查询 XML 目录并使用命令xmlcatalog:
$ xmlcatalog /etc/xml/catalog "-//OASIS//DTD DocBook XML V4.5//EN" file:/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd
每当 XML 文档引用此公共标识符时,它将收到本地路径/usr/share/xml/docbook/schema/dtd/4.5/docbookx.dtd.
概念
SUSE 上的 XML 目录概念由三个目录组成
- 主目录,位于/etc/xml/catalog。通常,您不需要修改此目录。
- 子目录,放置在目录/etc/xml/catalog.d/下。子目录通常以其软件包名称命名,以便区分它们(PACKAGENAME.xml)。这是您添加所有标识符的地方。
- 生成的 XML 目录/etc/xml/catalog-d.xml在安装、更新和删除期间会重写。切勿修改此目录!
通常,Linux 上的任何 XML 工具都会查询主目录,但不会查询任何子目录。这是一个实现细节,在每个 Linux 发行版中都不同,甚至在不同的 openSUSE 版本之间也不同。
添加 XML 目录支持
使用以下步骤将 XML 目录支持添加到您的软件包
步骤 1:准备您的 XML 目录
- 创建一个 XML 目录文件,并将其命名为您的 RPM 软件包。例如,如果您的 RPM 软件包是foo,请将您的目录文件命名为foo.xml.
- 将 URI、公共标识符等插入到您的目录中。请参阅 docbook_5.xml 作为示例。建议使用<group>元素并将所有标识符作为子元素添加。
步骤 2:创建您的 Spec 文件
要创建 spec 文件,请使用以下步骤
- 从通常的版权声明开始
# # spec file for package foo-schema # # Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed # upon. The license for this file, and modifications and additions to the # file, is the same license as for the pristine package itself (unless the # license for the pristine package is not an Open Source License, in which # case the license is the MIT License). An "Open Source License" is a # license that conforms to the Open Source Definition (Version 1.9) # published by the Open Source Initiative. # Please submit bugfixes or comments via https://bugs.opensuse.org/ #
- 添加最小的占位符集
%define xml_sysconf_dir %{_sysconfdir}/xml %define xml_catalogd_dir %{xml_sysconf_dir}/catalog.d - 建议,但可选地,定义更多的占位符。这使得更改和保持一致性更容易。例如,如果您的软件包foo带有 RELAX NG、Schematron、XSD 和/或 NVDL 模式,您可以定义(省略您不需要的内容)
%define foo_dir %{_datadir}/xml/foo %define foo_schema_dir %{foo_dir}/schema %define foo_rng_dir %{foo_schema_dir}/rng %define foo_nvdl_dir %{foo_schema_dir}/nvdl %define foo_sch_dir %{foo_schema_dir}/sch %define foo_xsd_dir %{foo_schema_dir}/xsd %define foo_version 2.0 - 在您的标题中,添加另一行源,其中包含您的 XML 目录文件的名称,例如
Source1: %{name}.xml - Require at leastsgml-skel >= 0.7:
Requires: sgml-skel >= 0.7 Requires(post): sgml-skel >= 0.7 Requires(postun): sgml-skel >= 0.7
- 可选地添加一个%build部分,如果您需要先构建您的目录。请参阅 its-schema 作为示例。
- 在%install部分安装 XML 目录
%install mkdir -p %{buildroot}%{xml_catalogd_dir} # ... cp -vi %{SOURCE1} %{buildroot}%{xml_catalogd_dir}如果您已经有 Makefile、Shell 脚本等,则可以减少此步骤。要安装模式和其他文件,您需要扩展此步骤(使用步骤 3 中的占位符)。
- 添加%post和%postun部分
%post update-xml-catalog %postun update-xml-catalog
- 将 XML 目录作为%config在%files部分安装 XML 目录
%config %{xml_sysconf_dir}/catalog.d/%{name}.xml
添加
建议应用spec-cleaner命令(相同的软件包名称)到您的 spec 文件,以提高风格和一致性。
步骤 3:构建和测试
- 安装您的 RPM 软件包并使用xmlcatalog查询目录(见上文)。
- 重建 RPM 软件包并重新安装。再次查询主目录,不应有任何更改。
- 删除 RPM 软件包。当您查询主目录时,您的 URI 或标识符不应再可访问。