openSUSE:Packaging PHP
通用说明
为了简化审查,请遵循所有 openSUSE 打包指南。
- 使用 spec-cleaner 验证您的 spec 文件,并使其成为易于阅读的格式。
- 检查软件包的许可证,并确保包含 LICENSE 文件:[1]
- 检查软件包组。Web 应用程序通常安装到
- 生产力/网络/Web/实用工具,库安装到
- 开发/库/其他 openSUSE:Package_group_guidelines#Networking
有一些有用的宏可用于打包 PHP
| 宏 | 典型值 | 说明 |
|---|---|---|
| %__php | /usr/bin/php | PHP 二进制文件 |
| %__phpize | /usr/bin/phpize | PHP-ize 二进制文件 |
| %__php_config | /usr/bin/php-config | PHP-config 二进制文件 |
| %php_version | ? | PHP 的版本 |
打包应用程序
基于 PEAR 包的 PHP 应用程序必须需要虚拟提供 php-pear(channelname/packagename),而不是实际的软件包名称。
PHP 应用程序应将 PHP 文件放在 /usr/share/php/{<Vendor Name> 或 <Application Name>} 下。例如
- /usr/share/php/roundcubemail 用于 roundcubemail 包
- /usr/share/php/nextcloud 用于 nextcloud 包
如果您希望在同一主机和同时安装多个版本,请考虑添加版本号(如果需要,用下划线替换点)。例如
- /usr/share/php/nextcloud13
- /usr/share/php/nextcloud14_0
支持不同的 Web 服务器
为 Apache 或 Nginx 等 Web 服务器提供配置片段对于任何软件包来说都是受欢迎的,也是一个很大的优势。但是,请考虑如果您支持不同的 Web 服务器,则创建子软件包
- moodle <- 主包。此软件包不应推荐或建议任何特定于 Web 服务器的子软件包。
- moodle-config-nginx
- 包含适用于 nginx 的配置文件和匹配的 requires/recommends
- 此软件包应具有
Requires: moodle
行,以便在用户卸载 moodle 时自动删除 - 此软件包应具有
Supplements: (nginx and moodle)
行,以便在用户安装 nginx 时自动选择
- moodle-config-apache
- 包含适用于 apache(2) 的配置文件和匹配的 requires/provides
- 此软件包应具有
Requires: moodle
行,以便在用户卸载 moodle 时自动删除 - 此软件包应具有
Supplements: (apache2 and moodle)
行,以便在用户安装 apache2 时自动选择
composer 文件
composer.json 文件未使用,应作为 %doc 安装,因为它提供了有关软件包及其依赖项的有用信息。
PEAR 打包
要打包 pear 项目,可以使用几个宏。因此,在开发时需要 php-devel 以及 php-pear 包,并且在安装时需要 php-pear 包。
| 宏 | 典型值 | 说明 |
|---|---|---|
| %__pear | /usr/bin/pear | PEAR 二进制文件 |
| %php_pearxmldir | /var/lib/pear | PEAR 的 XML 目录 |
| %pear_phpdir | /usr/share/php7/PEAR | PEAR 的主目录 |
| %pear_docdir | /usr/share/php7/PEAR/doc | PEAR 文档目录 |
| %pear_testdir | /usr/share/php7/PEAR/test | PEAR 文档目录 |
| %pear_datadir | /usr/share/php7/PEAR/data | PEAR 数据目录 |
| %pear_cfgdir | /usr/share/php7/PEAR/cfg | PEAR 配置文件目录 |
| %pear_wwwdir | /usr/share/php7/PEAR/htdocs | PEAR htdocs 目录 |
| %pear_metadir | /usr/share/php7/PEAR | PEAR 元目录 |
打包 PEAR 频道
不来自官方 PEAR 仓库的 PEAR 包必须提供一个频道才能进行安装。频道的软件包名称应为小写,并且必须遵循此命名模式:php-pear-channel-{channel-name}。
每个 pear 频道必须包含
BuildRequires: php-devel
BuildRequires: php-pear
Requires: php-pear
Provides: php-channel(channel-name)
BuildRequires: php-devel
BuildArch: noarch
从 PHP5 和 PHP7 到新的打包模式
旧的频道命名模式在软件包名称中包含 PHP 的版本号。由于我们放弃了这一点,新的频道应在其 spec 中包含以下过时部分
Obsoletes: php5-pear-channel-oldchannelname
Obsoletes: php7-pear-channel-oldchannelname
SPEC 文件示例
Name: php-pear-channel-htmlpurifier
Version: 1.1
Release: 0
Summary: Adds HTML Purifier channel to PEAR
License: LGPL-3.0
Group: Development/Libraries/Other
Url: http://htmlpurifier.org/
Source0: http://htmlpurifier.org/channel.xml
BuildRequires: php-devel
BuildRequires: php-pear
Requires: php-pear
Provides: php-channel(htmlpurifier)
Obsoletes: php5-pear-channel-htmlpurifier
Obsoletes: php7-pear-channel-htmlpurifier
%description
This package adds the HTML Purifier htmlpurifier.org channel which
allows PEAR packages from this channel to be installed.
%prep
%setup -q -c -T
%build
# Empty build section, nothing to build
%install
mkdir -p %{buildroot}%{php_pearxmldir}
install -pm 644 %{SOURCE0} %{buildroot}%{php_pearxmldir}/htmlpurifier.org.xml
%post
if [ $1 -eq 1 ] ; then
%{__pear} channel-add %{php_pearxmldir}/htmlpurifier.org.xml > /dev/null || :
else
%{__pear} channel-update %{php_pearxmldir}/htmlpurifier.org.xml > /dev/null ||:
fi
%postun
if [ $1 -eq 0 ] ; then
%{__pear} channel-delete htmlpurifier.org > /dev/null || :
fi
%files
%{php_pearxmldir}/*
%changelog
打包 PEAR 包
PEAR 包的软件包名称应为小写,并且必须遵循此命名模式:php-pear-{package-name}。
每个 PEAR 包必须包含以下代码
BuildRequires: php-channel(channel-name)
BuildRequires: php-devel
BuildRequires: php-pear
BuildRequires: php-pear
Requires: php-pear
Requires: php-channel(channel-name)
Provides: php-pear(channel-name/package-name) = %{version}
Obsoletes: php5-pear-%{pear_sname}
Obsoletes: php7-pear-%{pear_sname}
BuildArch: noarch
对于来自主 PEAR 仓库的软件包,频道名称为空。未作为 PHP5 或 PHP7 包存在的软件包不应包含“Obsoletes”参数。
从 PHP5 和 PHP7 到新的打包模式
支持从 PHP5 或 PHP7 打包模式自动升级需要一些工作。该软件包必须提供所有外国软件包未使用过的名称。为了允许从 PHP5 版本平滑升级,该软件包应包含如下行
Obsoletes: php5-pear-old-package-name
Obsoletes: php7-pear-old-package-name
使用该软件包的应用程序应使用虚拟提供 php-pear(channel-name/package-name),而不是实际的软件包名称。
SPEC 文件示例
%define pear_name Auth_SASL
Name: php7-pear-Auth_SASL
Version: 1.1.0
Release: 0
Summary: Abstraction of various SASL mechanism responses
License: BSD-3-Clause
Group: Productivity/Networking/Web/Servers
URL: https://pear.php.net/package/%{pear_name}
Source: https://pear.php.net/get/%{pear_name}-%{version}.tgz
BuildRequires: php-devel
BuildRequires: php-pear
Requires: php-pear
Provides: php-pear(%{pear_name}) = %{version}
Obsoletes: php5-pear-%{pear_name}
Obsoletes: php7-pear-%{pear_name}
BuildArch: noarch
%description
Provides code to generate responses to common SASL mechanisms, including:
- Digest-MD5
- CramMD5
- Plain
- Anonymous
- Login (Pseudo mechanism)
%prep
%setup -q -n %{pear_name}-%{version}
# move package.xml when needed
[ -f ../package.xml ] && mv ../package.xml .
%build
%install
%{__pear} install --nodeps --offline --packagingroot %{buildroot} package.xml
install -D -m 0644 package.xml %{buildroot}%{php_pearxmldir}/%{pear_name}.xml
%{php_pear_gen_filelist}
%post
if [ "$1" = "1" ]; then
# on "rpm -ivh"
%{__pear} install --nodeps --soft --force --register-only %{php_pearxmldir}/%{pear_name}.xml || :
fi
if [ "$1" = "2" ]; then
# on "rpm -Uvh"
%{__pear} upgrade --offline --register-only %{php_pearxmldir}/%{pear_name}.xml || :
fi
%postun
if [ "$1" = "0" ]; then
# on "rpm -e"
%{__pear} uninstall --nodeps --ignore-errors --register-only pear.php.net/%{pear_name} || :
fi
%files -f %{name}.files
%docdir %{pear_docdir}
%exclude %{pear_metadir}/.??*
%exclude %{pear_testdir}
%changelog
在打包阶段运行 PHPUnit 测试
在可能的情况下,应在打包阶段运行 PHPUnit 测试。通常,运行这些测试应该很容易。
BuildRequires: php-phpunit
...
%check
pushd %{pear_name}-%{version}/Symfony/Component/%{pear_name}
# in case you don't want packaging to fail on failing tests, append "|| true" to the next line
phpunit --bootstrap autoloader.php