diff --git a/src/DependencyResolver/DependencyInstaller/SystemDependenciesDefinition.php b/src/DependencyResolver/DependencyInstaller/SystemDependenciesDefinition.php index d29adcef..7ea90bff 100644 --- a/src/DependencyResolver/DependencyInstaller/SystemDependenciesDefinition.php +++ b/src/DependencyResolver/DependencyInstaller/SystemDependenciesDefinition.php @@ -24,36 +24,42 @@ public static function default(): self PackageManager::Apt->value => 'libsodium-dev', PackageManager::Apk->value => 'libsodium-dev', PackageManager::Dnf->value => 'pkgconfig(libsodium)', + PackageManager::Microdnf->value => 'pkgconfig(libsodium)', PackageManager::Yum->value => 'pkgconfig(libsodium)', ], 'jpeg' => [ PackageManager::Apt->value => 'libjpeg-dev', PackageManager::Apk->value => 'libjpeg-turbo-dev', PackageManager::Dnf->value => 'pkgconfig(libjpeg)', + PackageManager::Microdnf->value => 'pkgconfig(libjpeg)', PackageManager::Yum->value => 'pkgconfig(libjpeg)', ], 'zip' => [ PackageManager::Apt->value => 'libzip-dev', PackageManager::Apk->value => 'libzip-dev', PackageManager::Dnf->value => 'pkgconfig(libzip)', + PackageManager::Microdnf->value => 'pkgconfig(libzip)', PackageManager::Yum->value => 'pkgconfig(libzip)', ], 'xslt' => [ PackageManager::Apt->value => 'libxslt1-dev', PackageManager::Apk->value => 'libxslt-dev', PackageManager::Dnf->value => 'pkgconfig(libxslt)', + PackageManager::Microdnf->value => 'pkgconfig(libxslt)', PackageManager::Yum->value => 'pkgconfig(libxslt)', ], 'ffi' => [ PackageManager::Apt->value => 'libffi-dev', PackageManager::Apk->value => 'libffi-dev', PackageManager::Dnf->value => 'pkgconfig(libffi)', + PackageManager::Microdnf->value => 'pkgconfig(libffi)', PackageManager::Yum->value => 'pkgconfig(libffi)', ], 'curl' => [ PackageManager::Apt->value => 'libcurl4-openssl-dev', PackageManager::Apk->value => 'curl-dev', PackageManager::Dnf->value => 'pkgconfig(libcurl)', + PackageManager::Microdnf->value => 'pkgconfig(libcurl)', PackageManager::Yum->value => 'pkgconfig(libcurl)', ], ]); diff --git a/src/Platform/PackageManager.php b/src/Platform/PackageManager.php index 8b1dfb3f..3b74349a 100644 --- a/src/Platform/PackageManager.php +++ b/src/Platform/PackageManager.php @@ -17,12 +17,15 @@ /** @internal This is not public API for PIE, so should not be depended upon unless you accept the risk of BC breaks */ enum PackageManager: string { - case Test = 'test'; - case Apt = 'apt-get'; - case Apk = 'apk'; - case Dnf = 'dnf'; - case Yum = 'yum'; - case Brew = 'brew'; + case Test = 'test'; + case Apt = 'apt-get'; + case Apk = 'apk'; + case Dnf = 'dnf'; + case Microdnf = 'microdnf'; + case Brew = 'brew'; + + /** @deprecated Use `dnf` instead of `yum` */ + case Yum = 'yum'; public static function detect(): self|null { @@ -53,6 +56,7 @@ public function installCommand(array $packages): array self::Apt => ['apt-get', 'install', '-y', '--no-install-recommends', '--no-install-suggests', ...$packages], self::Apk => ['apk', 'add', '--no-cache', '--virtual', '.php-pie-deps', ...$packages], self::Dnf => ['dnf', 'install', '-y', ...$packages], + self::Microdnf => ['microdnf', 'install', '-y', ...$packages], self::Yum => ['yum', 'install', '-y', ...$packages], self::Brew => ['brew', 'install', ...$packages], }; @@ -61,6 +65,10 @@ public function installCommand(array $packages): array /** @param list $packages */ public function install(IOInterface $io, array $packages): void { + if ($this === self::Yum) { + $io->writeError('Usage of `yum` in PIE is deprecated in favour of `dnf`, and will be removed in a future release of PIE.'); + } + $outputCallback = Process::outputCallbackForVerbosity($io, IOInterface::VERY_VERBOSE); $cmd = self::installCommand($packages); diff --git a/src/SelfManage/BuildTools/CheckAllBuildTools.php b/src/SelfManage/BuildTools/CheckAllBuildTools.php index 72870c11..4c41074b 100644 --- a/src/SelfManage/BuildTools/CheckAllBuildTools.php +++ b/src/SelfManage/BuildTools/CheckAllBuildTools.php @@ -26,6 +26,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'gcc', PackageManager::Apk->value => 'build-base', PackageManager::Dnf->value => 'gcc', + PackageManager::Microdnf->value => 'gcc', PackageManager::Yum->value => 'gcc', PackageManager::Brew->value => 'gcc', ], @@ -36,6 +37,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'make', PackageManager::Apk->value => 'build-base', PackageManager::Dnf->value => 'make', + PackageManager::Microdnf->value => 'make', PackageManager::Yum->value => 'make', PackageManager::Brew->value => 'make', ], @@ -46,6 +48,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'autoconf', PackageManager::Apk->value => 'autoconf', PackageManager::Dnf->value => 'autoconf', + PackageManager::Microdnf->value => 'autoconf', PackageManager::Yum->value => 'autoconf', PackageManager::Brew->value => 'autoconf', ], @@ -56,6 +59,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'pkg-config', PackageManager::Apk->value => 'pkgconfig', PackageManager::Dnf->value => 'pkgconf-pkg-config', + PackageManager::Microdnf->value => 'pkgconf-pkg-config', PackageManager::Yum->value => 'pkgconf-pkg-config', PackageManager::Brew->value => 'pkgconf', ], @@ -66,6 +70,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'libtool', PackageManager::Apk->value => 'libtool', PackageManager::Dnf->value => 'libtool', + PackageManager::Microdnf->value => 'libtool', PackageManager::Yum->value => 'libtool', PackageManager::Brew->value => 'libtool', ], @@ -85,6 +90,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'unzip', PackageManager::Apk->value => 'unzip', PackageManager::Dnf->value => 'unzip', + PackageManager::Microdnf->value => 'unzip', PackageManager::Yum->value => 'unzip', PackageManager::Brew->value => 'unzip', ], @@ -94,6 +100,7 @@ public static function buildToolsFactory(): self PackageManager::Apt->value => 'php-dev', PackageManager::Apk->value => 'php{major}{minor}-dev', PackageManager::Dnf->value => '{php-config-path}', + PackageManager::Microdnf->value => '{php-config-path}', PackageManager::Yum->value => '{php-config-path}', PackageManager::Brew->value => 'php', ], diff --git a/test/end-to-end/Dockerfile b/test/end-to-end/Dockerfile index 986db2af..6b8b6512 100644 --- a/test/end-to-end/Dockerfile +++ b/test/end-to-end/Dockerfile @@ -3,6 +3,7 @@ FROM alpine:3.24 AS alpine_base FROM fedora:44 AS fedora_base FROM ubuntu:26.04 AS ubuntu_base FROM homebrew/brew:4.6.20 AS homebrew_base +FROM redhat/ubi9-minimal:9.8 AS ubi9_base FROM box_base AS build_pie_phar RUN apk add git @@ -28,6 +29,12 @@ COPY --from=build_pie_phar /app/pie.phar /usr/local/bin/pie RUN pie install --auto-install-build-tools -vv asgrim/example-pie-extension:2.0.5 RUN pie show +FROM ubi9_base AS test_pie_installs_build_tools_on_ubi9 +RUN microdnf module enable -y php:8.3 && microdnf install -y php-cli php-pecl-zip unzip +COPY --from=build_pie_phar /app/pie.phar /usr/local/bin/pie +RUN pie install --auto-install-build-tools -v asgrim/example-pie-extension:2.0.5 +RUN pie show + FROM ubuntu_base AS test_pie_installs_build_tools_on_ubuntu RUN apt-get update && apt-get install -y php unzip libbz2-dev COPY --from=build_pie_phar /app/pie.phar /usr/local/bin/pie diff --git a/test/unit/Platform/PackageManagerTest.php b/test/unit/Platform/PackageManagerTest.php index 87c72d92..4e7009c7 100644 --- a/test/unit/Platform/PackageManagerTest.php +++ b/test/unit/Platform/PackageManagerTest.php @@ -4,9 +4,11 @@ namespace Php\PieUnitTest\Platform; +use Composer\IO\BufferIO; use Php\Pie\Platform\PackageManager; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; +use Symfony\Component\Process\Exception\ProcessFailedException; #[CoversClass(PackageManager::class)] final class PackageManagerTest extends TestCase @@ -29,6 +31,10 @@ public function testInstallCommand(): void ['dnf', 'install', '-y', 'a', 'b'], PackageManager::Dnf->installCommand(['a', 'b']), ); + self::assertSame( + ['microdnf', 'install', '-y', 'a', 'b'], + PackageManager::Microdnf->installCommand(['a', 'b']), + ); self::assertSame( ['yum', 'install', '-y', 'a', 'b'], PackageManager::Yum->installCommand(['a', 'b']), @@ -38,4 +44,17 @@ public function testInstallCommand(): void PackageManager::Brew->installCommand(['a', 'b']), ); } + + public function testInstallWithYumWritesDeprecationWarning(): void + { + $io = new BufferIO(); + + try { + PackageManager::Yum->install($io, ['some-package-that-does-not-exist']); + } catch (ProcessFailedException) { + // Expected + } + + self::assertStringContainsString('deprecated', $io->getOutput()); + } }