mirror of
https://github.com/laravel/valet.git
synced 2026-02-05 00:20:08 +01:00
Improvements to "valet use" command
- properly detects if the requested version is already installed, and skips re-installing/re-starting/re-configuring - allows --force to re-configure anyway - smarter treatment of 'php' when it's aliased to another specific installed version
This commit is contained in:
@@ -41,14 +41,23 @@ function __construct(CommandLine $cli, Filesystem $files)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine if the given formula is installed.
|
* Ensure the formula exists in the current Homebrew configuration
|
||||||
*
|
*
|
||||||
* @param string $formula
|
* @param string $formula
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function installed($formula)
|
function installed($formula)
|
||||||
{
|
{
|
||||||
return in_array($formula, explode(PHP_EOL, $this->cli->runAsUser('brew list --formula | grep '.$formula)));
|
$result = $this->cli->runAsUser("brew info $formula --json");
|
||||||
|
|
||||||
|
// should be a json response, but if not installed then "Error: No available formula ..."
|
||||||
|
if (starts_with($result, 'Error: No')) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$details = json_decode($result);
|
||||||
|
|
||||||
|
return !empty($details[0]->installed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -58,9 +67,11 @@ function installed($formula)
|
|||||||
*/
|
*/
|
||||||
function hasInstalledPhp()
|
function hasInstalledPhp()
|
||||||
{
|
{
|
||||||
return $this->supportedPhpVersions()->contains(function ($version) {
|
$installed = $this->installedPhpFormulae()->first(function ($formula) {
|
||||||
return $this->installed($version);
|
return $this->supportedPhpVersions()->contains($formula);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return !empty($installed);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,13 +84,25 @@ function supportedPhpVersions()
|
|||||||
return collect(static::SUPPORTED_PHP_VERSIONS);
|
return collect(static::SUPPORTED_PHP_VERSIONS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function installedPhpFormulae()
|
||||||
|
{
|
||||||
|
return collect(
|
||||||
|
explode(PHP_EOL, $this->cli->runAsUser('brew list --formula | grep php'))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the aliased formula version from Homebrew
|
* Get the aliased formula version from Homebrew
|
||||||
*/
|
*/
|
||||||
function determineAliasedVersion($formula)
|
function determineAliasedVersion($formula)
|
||||||
{
|
{
|
||||||
$details = json_decode($this->cli->runAsUser("brew info $formula --json"));
|
$details = json_decode($this->cli->runAsUser("brew info $formula --json"));
|
||||||
return $details[0]->aliases[0] ?: 'ERROR - NO BREW ALIAS FOUND';
|
|
||||||
|
if (!empty($details[0]->aliases[0])) {
|
||||||
|
return $details[0]->aliases[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'ERROR - NO BREW ALIAS FOUND';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,6 +158,9 @@ function installOrFail($formula, $options = [], $taps = [])
|
|||||||
}
|
}
|
||||||
|
|
||||||
output('<info>['.$formula.'] is not installed, installing it now via Brew...</info> 🍻');
|
output('<info>['.$formula.'] is not installed, installing it now via Brew...</info> 🍻');
|
||||||
|
if ($formula !== 'php' && starts_with($formula, 'php') && preg_replace('/[^\d]/', '', $formula) < '73') {
|
||||||
|
warning('Note: older PHP versions may take 10+ minutes to compile from source. Please wait ...');
|
||||||
|
}
|
||||||
|
|
||||||
$this->cli->runAsUser(trim('brew install '.$formula.' '.implode(' ', $options)), function ($exitCode, $errorOutput) use ($formula) {
|
$this->cli->runAsUser(trim('brew install '.$formula.' '.implode(' ', $options)), function ($exitCode, $errorOutput) use ($formula) {
|
||||||
output($errorOutput);
|
output($errorOutput);
|
||||||
@@ -213,16 +239,16 @@ function hasLinkedPhp()
|
|||||||
function getParsedLinkedPhp()
|
function getParsedLinkedPhp()
|
||||||
{
|
{
|
||||||
if (! $this->hasLinkedPhp()) {
|
if (! $this->hasLinkedPhp()) {
|
||||||
throw new DomainException("Homebrew PHP appears not to be linked.");
|
throw new DomainException("Homebrew PHP appears not to be linked. Please run [valet use php@X.Y]");
|
||||||
}
|
}
|
||||||
|
|
||||||
$resolvedPath = $this->files->readLink(BREW_PREFIX.'/bin/php');
|
$resolvedPath = $this->files->readLink(BREW_PREFIX.'/bin/php');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Typical homebrew path resolutions are like:
|
* Typical homebrew path resolutions are like:
|
||||||
* "../Cellar/php@7.2/7.2.13/bin/php"
|
* "../Cellar/php@7.4/7.4.13/bin/php"
|
||||||
* or older styles:
|
* or older styles:
|
||||||
* "../Cellar/php/7.2.9_2/bin/php
|
* "../Cellar/php/7.4.9_2/bin/php
|
||||||
* "../Cellar/php55/bin/php
|
* "../Cellar/php55/bin/php
|
||||||
*/
|
*/
|
||||||
preg_match('~\w{3,}/(php)(@?\d\.?\d)?/(\d\.\d)?([_\d\.]*)?/?\w{3,}~', $resolvedPath, $matches);
|
preg_match('~\w{3,}/(php)(@?\d\.?\d)?/(\d\.\d)?([_\d\.]*)?/?\w{3,}~', $resolvedPath, $matches);
|
||||||
@@ -231,12 +257,11 @@ function getParsedLinkedPhp()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the currently linked formula
|
* Gets the currently linked formula by identifying the symlink in the hombrew bin directory.
|
||||||
* E.g if under php, will be php, if under php@7.3 will be that
|
* Different to ->linkedPhp() in that this will just get the linked directory name,
|
||||||
* Different to ->linkedPhp() in that this will just get the linked directory name (whether that is php, php55 or
|
* whether that is php, php74 or php@7.4
|
||||||
* php@7.2)
|
|
||||||
*
|
*
|
||||||
* @return mixed
|
* @return string
|
||||||
*/
|
*/
|
||||||
function getLinkedPhpFormula()
|
function getLinkedPhpFormula()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ class Diagnose
|
|||||||
'brew services list',
|
'brew services list',
|
||||||
'brew list --formula --versions | grep -E "(php|nginx|dnsmasq|mariadb|mysql|mailhog|openssl)(@\d\..*)?\s"',
|
'brew list --formula --versions | grep -E "(php|nginx|dnsmasq|mariadb|mysql|mailhog|openssl)(@\d\..*)?\s"',
|
||||||
'brew outdated',
|
'brew outdated',
|
||||||
|
'brew tap',
|
||||||
'php -v',
|
'php -v',
|
||||||
'which -a php',
|
'which -a php',
|
||||||
'php --ini',
|
'php --ini',
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class PhpFpm
|
|||||||
var $brew, $cli, $files;
|
var $brew, $cli, $files;
|
||||||
|
|
||||||
var $taps = [
|
var $taps = [
|
||||||
'homebrew/homebrew-core'
|
'homebrew/homebrew-core',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -168,14 +168,26 @@ function stopRunning()
|
|||||||
* Use a specific version of php
|
* Use a specific version of php
|
||||||
*
|
*
|
||||||
* @param $version
|
* @param $version
|
||||||
|
* @param $force
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function useVersion($version)
|
function useVersion($version, $force = false)
|
||||||
{
|
{
|
||||||
$version = $this->validateRequestedVersion($version);
|
$version = $this->validateRequestedVersion($version);
|
||||||
|
|
||||||
// Install the relevant formula if not already installed
|
try {
|
||||||
$this->brew->ensureInstalled($version);
|
if ($this->brew->linkedPhp() === $version && !$force) {
|
||||||
|
output(sprintf('<info>Valet is already using version: <comment>%s</comment>.</info> To re-link and re-configure use the --force parameter.' . PHP_EOL,
|
||||||
|
$version));
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
} catch (DomainException $e)
|
||||||
|
{ /* ignore thrown exception when no linked php is found */ }
|
||||||
|
|
||||||
|
if (!$this->brew->installed($version)) {
|
||||||
|
// Install the relevant formula if not already installed
|
||||||
|
$this->brew->ensureInstalled($version, [], $this->taps);
|
||||||
|
}
|
||||||
|
|
||||||
// Unlink the current php if there is one
|
// Unlink the current php if there is one
|
||||||
if ($this->brew->hasLinkedPhp()) {
|
if ($this->brew->hasLinkedPhp()) {
|
||||||
@@ -187,6 +199,9 @@ function useVersion($version)
|
|||||||
info(sprintf('Linking new version: %s', $version));
|
info(sprintf('Linking new version: %s', $version));
|
||||||
$this->brew->link($version, true);
|
$this->brew->link($version, true);
|
||||||
|
|
||||||
|
$this->stopRunning();
|
||||||
|
|
||||||
|
// ensure configuration is correct and start the linked version
|
||||||
$this->install();
|
$this->install();
|
||||||
|
|
||||||
return $version === 'php' ? $this->brew->determineAliasedVersion($version) : $version;
|
return $version === 'php' ? $this->brew->determineAliasedVersion($version) : $version;
|
||||||
@@ -211,16 +226,6 @@ function validateRequestedVersion($version)
|
|||||||
{
|
{
|
||||||
$version = $this->normalizePhpVersion($version);
|
$version = $this->normalizePhpVersion($version);
|
||||||
|
|
||||||
if ($version === 'php') {
|
|
||||||
if (strpos($this->brew->determineAliasedVersion($version), '@')) {
|
|
||||||
return $version;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->brew->hasInstalledPhp()) {
|
|
||||||
throw new DomainException('Brew is already using PHP '.PHP_VERSION.' as \'php\' in Homebrew. To use another version, please specify. eg: php@7.3');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$this->brew->supportedPhpVersions()->contains($version)) {
|
if (!$this->brew->supportedPhpVersions()->contains($version)) {
|
||||||
throw new DomainException(
|
throw new DomainException(
|
||||||
sprintf(
|
sprintf(
|
||||||
@@ -230,6 +235,20 @@ function validateRequestedVersion($version)
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strpos($aliasedVersion = $this->brew->determineAliasedVersion($version), '@')) {
|
||||||
|
return $aliasedVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($version === 'php') {
|
||||||
|
if (strpos($aliasedVersion = $this->brew->determineAliasedVersion($version), '@')) {
|
||||||
|
return $aliasedVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->brew->hasInstalledPhp()) {
|
||||||
|
throw new DomainException('Brew is already using PHP '.PHP_VERSION.' as \'php\' in Homebrew. To use another version, please specify. eg: php@7.3');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $version;
|
return $version;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,6 +172,26 @@ function ends_with($haystack, $needles) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! function_exists('starts_with')) {
|
||||||
|
/**
|
||||||
|
* Determine if a given string starts with a given substring.
|
||||||
|
*
|
||||||
|
* @param string $haystack
|
||||||
|
* @param string|string[] $needles
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
function starts_with($haystack, $needles)
|
||||||
|
{
|
||||||
|
foreach ((array) $needles as $needle) {
|
||||||
|
if ((string) $needle !== '' && strncmp($haystack, $needle, strlen($needle)) === 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the user
|
* Get the user
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -462,15 +462,14 @@
|
|||||||
/**
|
/**
|
||||||
* Allow the user to change the version of php valet uses
|
* Allow the user to change the version of php valet uses
|
||||||
*/
|
*/
|
||||||
$app->command('use [phpVersion]', function ($phpVersion) {
|
$app->command('use [phpVersion] [--force]', function ($phpVersion, $force) {
|
||||||
if (!$phpVersion) {
|
if (!$phpVersion) {
|
||||||
return info('Valet is using ' . Brew::linkedPhp());
|
return info('Valet is using ' . Brew::linkedPhp());
|
||||||
}
|
}
|
||||||
|
|
||||||
PhpFpm::validateRequestedVersion($phpVersion);
|
PhpFpm::validateRequestedVersion($phpVersion);
|
||||||
|
|
||||||
PhpFpm::stopRunning();
|
$newVersion = PhpFpm::useVersion($phpVersion, $force);
|
||||||
$newVersion = PhpFpm::useVersion($phpVersion);
|
|
||||||
|
|
||||||
Nginx::restart();
|
Nginx::restart();
|
||||||
info(sprintf('Valet is now using %s.', $newVersion) . PHP_EOL);
|
info(sprintf('Valet is now using %s.', $newVersion) . PHP_EOL);
|
||||||
|
|||||||
Reference in New Issue
Block a user