openSUSE:Packaging PHP

跳转到:导航搜索


本页介绍如何使用 openSUSE 构建服务为 openSUSE 和其他系统打包 PHP 项目。所有全局打包指南也适用于 PHP 项目。
Icon-warning.png
警告: 此页面目前正在开发中。请测试并提出改进建议。
Icon-warning.png
警告: PHP 打包人员正在提供同时匹配不同 PHP 版本的软件包,因此开发仓库目前可能不一致。

通用说明

为了简化审查,请遵循所有 openSUSE 打包指南

  • 使用 spec-cleaner 验证您的 spec 文件,并使其成为易于阅读的格式。
  • 检查软件包的许可证,并确保包含 LICENSE 文件:[1]
  • 检查软件包组。Web 应用程序通常安装到

有一些有用的宏可用于打包 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 包。

Icon-warning.png
警告: 预计 PHP 8 将把 /usr/share/php7/PEAR 位置移动到 /usr/share/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