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 目录

  1. 创建一个 XML 目录文件,并将其命名为您的 RPM 软件包。例如,如果您的 RPM 软件包是foo,请将您的目录文件命名为foo.xml.
  2. 将 URI、公共标识符等插入到您的目录中。请参阅 docbook_5.xml 作为示例。建议使用<group>元素并将所有标识符作为子元素添加。

步骤 2:创建您的 Spec 文件

要创建 spec 文件,请使用以下步骤

  1. 从通常的版权声明开始
    #
    # 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/
    #
  2. 添加最小的占位符集
    %define xml_sysconf_dir   %{_sysconfdir}/xml
    %define xml_catalogd_dir  %{xml_sysconf_dir}/catalog.d
  3. 建议,但可选地,定义更多的占位符。这使得更改和保持一致性更容易。例如,如果您的软件包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
  4. 在您的标题中,添加另一行源,其中包含您的 XML 目录文件的名称,例如
    Source1:        %{name}.xml
  5. Require at leastsgml-skel >= 0.7:
    Requires:       sgml-skel >= 0.7
    Requires(post): sgml-skel >= 0.7
    Requires(postun): sgml-skel >= 0.7
  6. 可选地添加一个%build部分,如果您需要先构建您的目录。请参阅 its-schema 作为示例。
  7. %install部分安装 XML 目录
    %install
    mkdir -p %{buildroot}%{xml_catalogd_dir}
    # ...
    cp -vi %{SOURCE1} %{buildroot}%{xml_catalogd_dir}

    如果您已经有 Makefile、Shell 脚本等,则可以减少此步骤。要安装模式和其他文件,您需要扩展此步骤(使用步骤 3 中的占位符)。

  8. 添加%post%postun部分
    %post
    update-xml-catalog
    %postun
    update-xml-catalog
  9. 将 XML 目录作为%config%files部分安装 XML 目录
    %config %{xml_sysconf_dir}/catalog.d/%{name}.xml

添加

建议应用spec-cleaner命令(相同的软件包名称)到您的 spec 文件,以提高风格和一致性。

步骤 3:构建和测试

  1. 安装您的 RPM 软件包并使用xmlcatalog查询目录(见上文)。
  2. 重建 RPM 软件包并重新安装。再次查询主目录,不应有任何更改。
  3. 删除 RPM 软件包。当您查询主目录时,您的 URI 或标识符不应再可访问。