2.7. 软件包布局


每个 Software Collection 的布局都由 metapackage 组成,它安装其它软件包的子集,以及软件集合命名空间中的多个软件包,它们安装在 Software Collection 命名空间中。

2.7.1. Metapackage

每个 Software Collection 都会包括一个 metapackage,它安装一个 Software Collection 的软件包子集,这是用户使用 Software Collection 执行最常见任务所必需的。例如,基本软件包可以提供 Perl 语言解释器,但不能提供 Perl 扩展模块。metapackage 包含基本的文件系统层次结构,并提供多个 Software Collection 的 scriptlets。
metapackage 的目的是确保软件集合中的所有基本软件包都已正确安装,并可启用 Software Collection。
metapackage 会生成以下软件包,它们也是 Software Collection 的一部分:
主软件包: %name
Software Collection 中的主要软件包包含基本软件包的依赖项,它们包含在 Software Collection 中。主软件包不包含任何文件。
当为您的 Software Collection 软件包指定依赖项时,请确保 Software Collection 中没有其它软件包取决于主软件包。主软件包的目的是仅安装那些对用户使用 Software Collection 执行大多数常见任务所需的软件包。
通常,主软件包没有指定任何构建时间依赖项(例如,仅构建另一个 Software Collection 软件包依赖项的软件包)。
例如,如果 Software Collection 的名称是 myorganization-ruby193,则主软件包宏被扩展为:
myorganization-ruby193
运行时子软件包: %name-runtime
Software Collection 中的 runtime 子软件包拥有 Software Collection 的文件系统,并提供 Software Collection 的 scriptlets。需要安装此软件包,以便用户可以使用 Software Collection。
例如,如果 Software Collection 的名称是 myorganization-ruby193,则 runtime 子宏被扩展为:
myorganization-ruby193-runtime
构建子软件包: %name-build
Software Collection 中的 build 子软件包提供 Software Collection 的构建配置。它包含将软件包构建到 Software Collection 所需的 RPM 宏。build 子软件包是可选的,可以在 Software Collection 中排除。
例如,如果 Software Collection 的名称是 myorganization-ruby193,则构建子宏被扩展为:
myorganization-ruby193-build
myorganization-ruby193-build 子软件包的内容如下所示:
$ cat /etc/rpm/macros.ruby193-config
%scl myorganization-ruby193
syspaths 子软件包: %name-syspaths
Software Collection 中的 syspaths 子软件包提供了一种可选的方式,可将方便的 shell 包装程序和符号链接安装到标准路径,从而更改基本系统安装,但在 Software Collection 软件包中使二进制文件更易于使用。
例如,如果 Software Collection 的名称是 myorganization-ruby193,则 syspaths 子宏被扩展为:
myorganization-ruby193-syspaths
有关 syspaths 子软件包的详情请参考 第 3.3 节 “提供 syspaths Subpackages”
scldevel 子软件包: %name-scldevel
%name Software Collection 中的 scldevel 子软件包包含开发文件,这些文件在开发依赖于 %name Software Collection 的另一个 Software Collection 的软件包时非常有用。scldevel 子软件包是可选的,可以从 %name Software Collection 中排除。
例如,如果 Software Collection 的名称是 myorganization-ruby193,scldevel 子软件包宏将扩展为:
myorganization-ruby193-scldevel
有关 scldevel 子软件包的详情请参考 第 4.1 节 “提供 scldevel 子软件包”

2.7.2. 创建 Metapackage

在创建新 metapackage 时:

  • %scl_package 宏之上定义 metapackage spec 文件顶部的以下宏:
    • scl_name_prefix 指定用作软件集合名称中的前缀的供应商名称,如 myorganization-。这与 _scl_prefix 不同,它指定了软件集合的根目录,但也使用供应商的名称。请参阅 第 2.4 节 “Software Collection Prefix” 了解更多信息。
    • scl_name_base 指定 Software Collection 的基本名称,如 ruby
    • scl_name_version 指定 Software Collection 的版本,例如 193
  • 建议您定义一个 Software Collection 宏 nfsmountable,它更改配置和状态文件的位置,并使软件集合通过 NFS 提供。如需更多信息,请参阅 第 3.1 节 “通过 NFS 使用 Software Collections”
  • 考虑指定 Software Collection 作为 metapackage 的依赖项,它们对 Software Collection 运行非常重要的所有软件包。这样,您可以确保使用 Software Collection metapackage 安装软件包。
  • 建议您在 构建 子软件包中添加 Requires: scl-utils-build
  • 您不需要在 metapackage 中使用特定于 Software Collection 的宏的条件。
  • enable scriptlet 中包含 Software Collection 中软件包可能需要的任何路径撤销。
    有关常用路径重新definitions的详情,请参考 第 2.9 节 “常用的路径 Redefinitions”
  • 始终确保 metapackage 在 %prep 部分包含 %setup 宏,否则构建软件集合将失败。如果您不需要在 %setup 宏中使用特定选项,请将 %setup -c -T 命令添加到 %prep 部分。
    这是因为 %setup 宏定义并创建 %buildsubdir 目录,它通常用于在构建时存储临时文件。如果您没有在 Software Collection 软件包中定义 %setup,则 %buildsubdir 目录中的文件会被覆盖,从而导致构建失败。
  • 将您需要使用的任何宏添加到 构建 子软件包中的 macros.%{scl}-config 文件中。

Metapackage 示例

要了解名为 myorganization-ruby193 的软件集合的典型 metapackage 如下所示,请参阅以下示例:
%global scl_name_prefix myorganization-
%global scl_name_base ruby
%global scl_name_version 193

%global scl %{scl_name_prefix}%{scl_name_base}%{scl_name_version}

# Optional but recommended: define nfsmountable
%global nfsmountable 1

%global _scl_prefix /opt/myorganization
%scl_package %scl

Summary: Package that installs %scl
Name: %scl_name
Version: 1
Release: 1%{?dist}
License: GPLv2+
Requires: %{scl_prefix}less
BuildRequires: scl-utils-build

%description
This is the main package for %scl Software Collection.

%package runtime
Summary: Package that handles %scl Software Collection.
Requires: scl-utils

%description runtime
Package shipping essential scripts to work with %scl Software Collection.

%package build
Summary: Package shipping basic build configuration
Requires: scl-utils-build

%description build
Package shipping essential configuration macros to build %scl Software Collection.

# This is only needed when you want to provide an optional scldevel subpackage
%package scldevel
Summary: Package shipping development files for %scl

%description scldevel
Package shipping development files, especially useful for development of
packages depending on %scl Software Collection.

%prep
%setup -c -T

%install
%scl_install

cat >> %{buildroot}%{_scl_scripts}/enable << EOF
export PATH="%{_bindir}:%{_sbindir}\${PATH:+:\${PATH}}"
export LD_LIBRARY_PATH="%{_libdir}\${LD_LIBRARY_PATH:+:\${LD_LIBRARY_PATH}}"
export MANPATH="%{_mandir}:\${MANPATH:-}"
export PKG_CONFIG_PATH="%{_libdir}/pkgconfig\${PKG_CONFIG_PATH:+:\${PKG_CONFIG_PATH}}"
EOF

# This is only needed when you want to provide an optional scldevel subpackage
cat >> %{buildroot}%{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel << EOF
%%scl_%{scl_name_base} %{scl}
%%scl_prefix_%{scl_name_base} %{scl_prefix}
EOF

# Install the generated man page
mkdir -p %{buildroot}%{_mandir}/man7/
install -p -m 644 %{scl_name}.7 %{buildroot}%{_mandir}/man7/

%files

%files runtime -f filelist
%scl_files

%files build
%{_root_sysconfdir}/rpm/macros.%{scl}-config

%files scldevel
%{_root_sysconfdir}/rpm/macros.%{scl_name_base}-scldevel

%changelog
* Fri Aug 30 2013 John Doe &lt;jdoe@example.com&gt; 1-1
- Initial package
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.