Почему создание собственного RPM-пакета nginx/ModSecurity приведет к нарушению зависимостей Perl?

Я хочу предоставить пользовательский RPM-пакет nginx/ModSecurity/ сторонних модулей, который можно установить на внутренние серверы (без интернета) через собственный RPM-репозиторий.

Для этого я создал файл спецификации RPM (ниже приведены фрагменты исходной спецификации):

Name:           nginx
Version:        1.14.0
Release:        1
Group:          System Environment/Daemons
License:        BSD
URL:            http://nginx.net/
Source0:        http://nginx.org/download/nginx-%{version}.tar.gz
BuildRequires:  pcre-devel
BuildRequires:  openssl-devel
BuildRequires:  zlib-devel
BuildRequires:  libxslt-devel
BuildRequires:  gd-devel
BuildRequires:  GeoIP-devel
BuildRequires:  pam-devel
BuildRequires:  libmodsecurity-devel
Requires:       pcre
Requires:       openssl
Requires:       zlib
Requires:       libxslt
Requires:       gd
Requires:       GeoIP
Requires:       pam
Requires:       libmodsecurity

Полная спецификация RPM с дополнительными файлами rpmbuild доступна здесь: https://gist.github.com/soerenkornetzki/3731113644ab1084ed9549795b5987d6

Проблема в том, что когда я пытаюсь установить RPM, я сталкиваюсь с ошибками сломанной зависимости:

Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
           Requires: perl(Data::Types)
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
           Requires: /opt/local/bin/perl
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
           Requires: perl(Acme::Comment)
Error: Package: nginx-1.14.0-1.x86_64 (/nginx-1.14.0-1.x86_64)
           Requires: perl(Data::Validate::URI)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Я знаю, что nginx имеет модуль Perl, но я не включаю его в аргументы компиляции (см. Полную спецификацию с Gist).

У меня нет требуемых (любых) модулей Perl с BuildRequires или же Requires,

Я ожидаю, что ни один из сторонних модулей также не использует Perl. Это может быть ложным предположением, но я не проверял это, так как необходимые модули не установлены в системе сборки, и двоичный файл работает на ней (не требуется установка RPM, просто выполняется двоичный файл nginx).

Обороты для CentOS 7, который не поставляется с perl-Data-Types (назвать один пример). Был perl-Data-Types со старой CentOS 6 (EPEL), но она больше недоступна для CentOS 7 и выше (как показано на rpmfind.net).

Поскольку бинарный файл nginx работает просто отлично, и только установщик RPM отклоняет установку:

Как это исправить? Откуда пришли требуемые пакеты?

1 ответ

rpmbuild просматривает файлы в%files и, если есть, содержит use Data::Types тогда rpmbuild автоматически добавит Requires: perl(Data::Types)

Извлеките свой rpm-файл:

rpmdev-extract nginx.rpm

И посмотрите на загрузку этого модуля:

grep -r 'Data::Types' .

Я думаю, что будет какой-то файл с этой строкой.

Точнее, rpmbuild смотрит на shebangs (например, #!/usr/bin/perl), и если он обнаружит то, что выглядит как сценарий Perl, и если ваша система сборки поставляется сperl-generators, тогда он автоматически сгенерирует Requires а также Provides для файлов Perl, установленных вашим пакетом.

Например, если ваш пакет устанавливает файл Perl с такими операторами, как use Data::Validate::URI, вы в конечном итоге Requires: perl(Data::Validate::URI) в вашем файле RPM.

Упаковать отсутствующие модули Perl легко с помощью cpanspec полезность.

Помимо этого ваш Requires: libmodsecurity неверно - вы должны позволить RPM найти правильную зависимость библиотеки вместо того, чтобы "фиксировать" ее.

Для получения обновленного модуля ModSecurity nginx, а также зависимостей библиотек и модулей Perl обратитесь к этому репозиторию (например, не нужно ничего упаковывать, это уже было сделано).

Другие вопросы по тегам