Better hint for missing extensions (#10283)

main
Shalvah 3 years ago committed by GitHub
parent b9d7d27c82
commit 7a3d2b8157
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -47,16 +47,14 @@ class SolverProblemsException extends \RuntimeException
public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, $isVerbose, $isDevExtraction = false) public function getPrettyString(RepositorySet $repositorySet, Request $request, Pool $pool, $isVerbose, $isDevExtraction = false)
{ {
$installedMap = $request->getPresentMap(true); $installedMap = $request->getPresentMap(true);
$hasExtensionProblems = false; $missingExtensions = array();
$isCausedByLock = false; $isCausedByLock = false;
$problems = array(); $problems = array();
foreach ($this->problems as $problem) { foreach ($this->problems as $problem) {
$problems[] = $problem->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $this->learnedPool)."\n"; $problems[] = $problem->getPrettyString($repositorySet, $request, $pool, $isVerbose, $installedMap, $this->learnedPool)."\n";
if (!$hasExtensionProblems && $this->hasExtensionProblems($problem->getReasons())) { $missingExtensions = array_merge($missingExtensions, $this->getExtensionProblems($problem->getReasons()));
$hasExtensionProblems = true;
}
$isCausedByLock = $isCausedByLock || $problem->isCausedByLock($repositorySet, $request, $pool); $isCausedByLock = $isCausedByLock || $problem->isCausedByLock($repositorySet, $request, $pool);
} }
@ -72,8 +70,8 @@ class SolverProblemsException extends \RuntimeException
$hints[] = "Potential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see <https://getcomposer.org/doc/04-schema.md#minimum-stability> for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead <https://getcomposer.org/doc/articles/troubleshooting.md> for further common problems."; $hints[] = "Potential causes:\n - A typo in the package name\n - The package is not available in a stable-enough version according to your minimum-stability setting\n see <https://getcomposer.org/doc/04-schema.md#minimum-stability> for more details.\n - It's a private package and you forgot to add a custom repository to find it\n\nRead <https://getcomposer.org/doc/articles/troubleshooting.md> for further common problems.";
} }
if ($hasExtensionProblems) { if (!empty($missingExtensions)) {
$hints[] = $this->createExtensionHint(); $hints[] = $this->createExtensionHint($missingExtensions);
} }
if ($isCausedByLock && !$isDevExtraction && !$request->getUpdateAllowTransitiveRootDependencies()) { if ($isCausedByLock && !$isDevExtraction && !$request->getUpdateAllowTransitiveRootDependencies()) {
@ -106,9 +104,10 @@ class SolverProblemsException extends \RuntimeException
} }
/** /**
* @param string[] $missingExtensions
* @return string * @return string
*/ */
private function createExtensionHint() private function createExtensionHint(array $missingExtensions)
{ {
$paths = IniHelper::getAll(); $paths = IniHelper::getAll();
@ -116,28 +115,34 @@ class SolverProblemsException extends \RuntimeException
return ''; return '';
} }
$ignoreExtensionsArguments = implode(" ", array_map(function ($extension) {
return "--ignore-platform-req=$extension";
}, $missingExtensions));
$text = "To enable extensions, verify that they are enabled in your .ini files:\n - "; $text = "To enable extensions, verify that they are enabled in your .ini files:\n - ";
$text .= implode("\n - ", $paths); $text .= implode("\n - ", $paths);
$text .= "\nYou can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode."; $text .= "\nYou can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.";
$text .= "\nAlternatively, you can run Composer with `$ignoreExtensionsArguments` to temporarily ignore these required extensions.";
return $text; return $text;
} }
/** /**
* @param Rule[][] $reasonSets * @param Rule[][] $reasonSets
* @return bool * @return string[]
*/ */
private function hasExtensionProblems(array $reasonSets) private function getExtensionProblems(array $reasonSets)
{ {
$missingExtensions = array();
foreach ($reasonSets as $reasonSet) { foreach ($reasonSets as $reasonSet) {
foreach ($reasonSet as $rule) { foreach ($reasonSet as $rule) {
$required = $rule->getRequiredPackage(); $required = $rule->getRequiredPackage();
if (null !== $required && 0 === strpos($required, 'ext-')) { if (null !== $required && 0 === strpos($required, 'ext-')) {
return true; $missingExtensions[$required] = 1;
} }
} }
} }
return false; return array_keys($missingExtensions);
} }
} }

@ -52,5 +52,6 @@ Your requirements could not be resolved to an installable set of packages.
To enable extensions, verify that they are enabled in your .ini files: To enable extensions, verify that they are enabled in your .ini files:
__inilist__ __inilist__
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-filter` to temporarily ignore these required extensions.
--EXPECT-- --EXPECT--

@ -81,6 +81,7 @@ Your requirements could not be resolved to an installable set of packages.
To enable extensions, verify that they are enabled in your .ini files: To enable extensions, verify that they are enabled in your .ini files:
__inilist__ __inilist__
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-foobar --ignore-platform-req=ext-pcre --ignore-platform-req=ext-foobar --ignore-platform-req=ext-pcre` to temporarily ignore these required extensions.
--EXPECT-- --EXPECT--

@ -156,6 +156,7 @@ Read <https://getcomposer.org/doc/articles/troubleshooting.md> for further commo
To enable extensions, verify that they are enabled in your .ini files: To enable extensions, verify that they are enabled in your .ini files:
__inilist__ __inilist__
You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with `--ignore-platform-req=ext-xml` to temporarily ignore these required extensions.
Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions. Use the option --with-all-dependencies (-W) to allow upgrades, downgrades and removals for packages currently locked to specific versions.

Loading…
Cancel
Save