Better hint for missing extensions (#10283)
parent
b9d7d27c82
commit
7a3d2b8157
|
@ -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…
Reference in New Issue