diff --git a/README.md b/README.md
index 38544e84..b4ef97a5 100755
--- a/README.md
+++ b/README.md
@@ -194,6 +194,8 @@ Basic usage for building php with some extensions:
# fetch all libraries
./bin/spc download --all
+# dump a list of extensions required by your project
+./bin/spc dump-extensions
# only fetch necessary sources by needed extensions (recommended)
./bin/spc download --for-extensions="openssl,pcntl,mbstring,pdo_sqlite"
# download pre-built libraries first (save time for compiling dependencies)
diff --git a/src/SPC/ConsoleApplication.php b/src/SPC/ConsoleApplication.php
index 2609d317..7d1d8e8b 100644
--- a/src/SPC/ConsoleApplication.php
+++ b/src/SPC/ConsoleApplication.php
@@ -18,7 +18,9 @@ use SPC\command\dev\PhpVerCommand;
use SPC\command\dev\SortConfigCommand;
use SPC\command\DoctorCommand;
use SPC\command\DownloadCommand;
+use SPC\command\DumpExtensionsCommand;
use SPC\command\DumpLicenseCommand;
+use SPC\command\ExtensionDumperCommand;
use SPC\command\ExtractCommand;
use SPC\command\InstallPkgCommand;
use SPC\command\MicroCombineCommand;
@@ -54,6 +56,7 @@ final class ConsoleApplication extends Application
new MicroCombineCommand(),
new SwitchPhpVersionCommand(),
new SPCConfigCommand(),
+ new DumpExtensionsCommand(),
// Dev commands
new AllExtCommand(),
diff --git a/src/SPC/command/DumpExtensionsCommand.php b/src/SPC/command/DumpExtensionsCommand.php
new file mode 100644
index 00000000..215317dc
--- /dev/null
+++ b/src/SPC/command/DumpExtensionsCommand.php
@@ -0,0 +1,70 @@
+files as $file) {
+ if ($fs->exists($file)) {
+ $this->output->writeln("Analyzing file: {$file}");
+ $data = json_decode(file_get_contents($file), true);
+
+ if (!$data) {
+ $this->output->writeln("Error parsing {$file}");
+ continue;
+ }
+
+ $extensions = array_merge($extensions, $this->extractExtensions($data));
+ }
+ }
+
+ if (empty($extensions)) {
+ $this->output->writeln('No extensions found.');
+ return static::SUCCESS;
+ }
+
+ $extensions = array_unique($extensions);
+ sort($extensions);
+
+ $this->output->writeln("\nRequired PHP extensions:");
+ $this->output->writeln(implode(',', array_map(fn ($ext) => substr($ext, 4), $extensions)));
+
+ return static::SUCCESS;
+ }
+
+ private function extractExtensions(array $data): array
+ {
+ return array_merge(
+ ...array_map(
+ function ($package) {
+ return isset($package['require']) ? $this->filterExtensions($package['require']) : [];
+ },
+ $data['packages'] ?? [$data]
+ )
+ );
+ }
+
+ private function filterExtensions(array $requirements): array
+ {
+ return array_keys(array_filter($requirements, function ($key) {
+ return str_starts_with($key, 'ext-');
+ }, ARRAY_FILTER_USE_KEY));
+ }
+}