setup-php/src/scripts/win32.ps1

294 lines
9.3 KiB
PowerShell
Raw Normal View History

2019-09-06 06:47:43 +07:00
param (
2019-12-26 20:01:18 +07:00
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$version = '7.4',
[Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
2020-10-05 14:36:12 +07:00
$dist
2019-09-06 06:47:43 +07:00
)
2019-10-17 03:11:13 +07:00
Function Step-Log($message) {
2019-10-23 16:57:40 +07:00
printf "\n\033[90;1m==> \033[0m\033[37;1m%s \033[0m\n" $message
2019-10-17 03:11:13 +07:00
}
Function Add-Log($mark, $subject, $message) {
$code = if ($mark -eq $cross) { "31" } else { "32" }
2019-10-23 16:57:40 +07:00
printf "\033[%s;1m%s \033[0m\033[34;1m%s \033[0m\033[90;1m%s \033[0m\n" $code $mark $subject $message
2019-10-17 03:11:13 +07:00
}
2020-06-08 04:21:17 +07:00
Function Add-ToProfile {
param(
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$input_profile,
[Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$search,
[Parameter(Position = 2, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$value
)
if($null -eq (Get-Content $input_profile | findstr $search)) {
Add-Content -Path $input_profile -Value $value
}
}
2020-09-07 04:06:21 +07:00
Function Add-Printf {
if (-not(Test-Path "C:\Program Files\Git\usr\bin\printf.exe")) {
if(Test-Path "C:\msys64\usr\bin\printf.exe") {
New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value C:\msys64\usr\bin\printf.exe
} else {
Invoke-WebRequest -UseBasicParsing -Uri "https://github.com/shivammathur/printf/releases/latest/download/printf-x64.zip" -OutFile "$php_dir\printf.zip"
Expand-Archive -Path $php_dir\printf.zip -DestinationPath $php_dir -Force
}
} else {
New-Item -Path $php_dir\printf.exe -ItemType SymbolicLink -Value "C:\Program Files\Git\usr\bin\printf.exe"
}
}
2020-03-16 12:48:01 +07:00
Function Install-PhpManager() {
$module_path = "$php_dir\PhpManager\PhpManager.psm1"
if(-not (Test-Path $module_path -PathType Leaf)) {
$zip_file = "$php_dir\PhpManager.zip"
Invoke-WebRequest -UseBasicParsing -Uri 'https://github.com/mlocati/powershell-phpmanager/releases/latest/download/PhpManager.zip' -OutFile $zip_file
Expand-Archive -Path $zip_file -DestinationPath $php_dir -Force
}
2020-03-16 12:48:01 +07:00
Import-Module $module_path
Add-ToProfile $current_profile 'powershell-phpmanager' "Import-Module $module_path"
2020-03-16 12:48:01 +07:00
}
Function Add-Extension {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension,
[Parameter(Position = 1, Mandatory = $false)]
[ValidateNotNull()]
[ValidateSet('stable', 'beta', 'alpha', 'devel', 'snapshot')]
[string]
2020-07-14 15:42:50 +07:00
$stability = 'stable',
[Parameter(Position = 2, Mandatory = $false)]
[ValidateNotNull()]
[ValidatePattern('^\d+(\.\d+){0,2}$')]
[string]
$extension_version = ''
)
2019-10-11 06:11:25 +07:00
try {
$extension_info = Get-PhpExtension -Path $php_dir | Where-Object { $_.Name -eq $extension -or $_.Handle -eq $extension }
2020-01-30 13:33:30 +07:00
if ($null -ne $extension_info) {
switch ($extension_info.State) {
'Builtin' {
Add-Log $tick $extension "Enabled"
}
'Enabled' {
Add-Log $tick $extension "Enabled"
}
default {
Enable-PhpExtension -Extension $extension_info.Handle -Path $php_dir
Add-Log $tick $extension "Enabled"
}
2019-10-11 06:11:25 +07:00
}
}
else {
2020-07-14 15:42:50 +07:00
if($extension_version -ne '') {
Install-PhpExtension -Extension $extension -Version $extension_version -MinimumStability $stability -MaximumStability $stability -Path $php_dir
} else {
Install-PhpExtension -Extension $extension -MinimumStability $stability -MaximumStability $stability -Path $php_dir
}
2020-01-30 13:33:30 +07:00
Add-Log $tick $extension "Installed and enabled"
2019-10-11 06:11:25 +07:00
}
}
catch {
2019-12-09 09:39:03 +07:00
Add-Log $cross $extension "Could not install $extension on PHP $($installed.FullVersion)"
}
}
2019-12-26 20:01:18 +07:00
Function Remove-Extension() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
2019-12-26 20:01:18 +07:00
[ValidateLength(1, [int]::MaxValue)]
[string]
$extension
)
2019-12-26 20:01:18 +07:00
if(php -m | findstr -i $extension) {
Disable-PhpExtension $extension $php_dir
}
if (Test-Path $ext_dir\php_$extension.dll) {
Remove-Item $ext_dir\php_$extension.dll
}
}
2020-07-07 18:06:32 +07:00
Function Edit-ComposerConfig() {
Param(
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$tool_path
)
Copy-Item $tool_path -Destination "$tool_path.phar"
php -r "try {`$p=new Phar('$tool_path.phar', 0);exit(0);} catch(Exception `$e) {exit(1);}"
if ($? -eq $False) {
Add-Log "$cross" "composer" "Could not download composer"
exit 1;
}
composer -q global config process-timeout 0
Write-Output $composer_bin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8
2020-07-07 18:06:32 +07:00
if (Test-Path env:COMPOSER_TOKEN) {
composer -q global config github-oauth.github.com $env:COMPOSER_TOKEN
}
}
2019-12-27 08:26:49 +07:00
Function Add-Tool() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
$url,
[Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$tool
)
2020-01-26 12:41:36 +07:00
if (Test-Path $php_dir\$tool) {
Remove-Item $php_dir\$tool
}
if($url.Count -gt 1) { $url = $url[0] }
2020-05-13 22:43:58 +07:00
if ($tool -eq "symfony") {
2020-01-26 12:41:36 +07:00
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool.exe
2020-06-08 04:21:17 +07:00
Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.exe" > $null 2>&1
2019-12-28 02:12:00 +07:00
} else {
try {
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $php_dir\$tool
$bat_content = @()
$bat_content += "@ECHO off"
$bat_content += "setlocal DISABLEDELAYEDEXPANSION"
$bat_content += "SET BIN_TARGET=%~dp0/" + $tool
$bat_content += "php %BIN_TARGET% %*"
Set-Content -Path $php_dir\$tool.bat -Value $bat_content
2020-06-08 04:21:17 +07:00
Add-ToProfile $current_profile $tool "New-Alias $tool $php_dir\$tool.bat" > $null 2>&1
2020-01-26 12:41:36 +07:00
} catch { }
}
2020-01-21 03:10:24 +07:00
if($tool -eq "phive") {
Add-Extension curl >$null 2>&1
Add-Extension mbstring >$null 2>&1
Add-Extension xml >$null 2>&1
2020-05-13 22:43:58 +07:00
} elseif($tool -eq "cs2pr") {
(Get-Content $php_dir/cs2pr).replace('exit(9)', 'exit(0)') | Set-Content $php_dir/cs2pr
2020-05-13 22:43:58 +07:00
} elseif($tool -eq "composer") {
2020-07-07 18:06:32 +07:00
Edit-ComposerConfig $php_dir\$tool
} elseif($tool -eq "wp-cli") {
Copy-Item $php_dir\wp-cli.bat -Destination $php_dir\wp.bat
}
2020-05-13 22:43:58 +07:00
2020-01-26 18:51:04 +07:00
if (((Get-ChildItem -Path $php_dir/* | Where-Object Name -Match "^$tool(.exe|.phar)*$").Count -gt 0)) {
2020-01-26 12:41:36 +07:00
Add-Log $tick $tool "Added"
} else {
Add-Log $cross $tool "Could not add $tool"
}
}
2020-03-01 07:50:48 +07:00
Function Add-Composertool() {
Param (
[Parameter(Position = 0, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$tool,
[Parameter(Position = 1, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$release,
[Parameter(Position = 2, Mandatory = $true)]
[ValidateNotNull()]
[ValidateLength(1, [int]::MaxValue)]
[string]
$prefix
)
composer -q global require $prefix$release 2>&1 | out-null
if($?) {
Add-Log $tick $tool "Added"
} else {
Add-Log $cross $tool "Could not setup $tool"
2019-12-27 08:26:49 +07:00
}
if(Test-Path $composer_bin\composer) {
Copy-Item -Path "$php_dir\composer" -Destination "$composer_bin\composer" -Force
}
2019-12-27 08:26:49 +07:00
}
2020-03-01 07:50:48 +07:00
Function Add-Pecl() {
Add-Log $tick "PECL" "Use extensions input to setup PECL extensions on windows"
2019-12-27 08:26:49 +07:00
}
2019-12-26 20:01:18 +07:00
# Variables
$tick = ([char]8730)
$cross = ([char]10007)
$php_dir = 'C:\tools\php'
2020-05-13 22:29:26 +07:00
$ext_dir = "$php_dir\ext"
2020-06-08 04:21:17 +07:00
$current_profile = "$PSHOME\Profile.ps1"
2019-12-26 20:01:18 +07:00
$ProgressPreference = 'SilentlyContinue'
$composer_bin = "$env:APPDATA\Composer\vendor\bin"
2019-12-26 20:01:18 +07:00
$master_version = '8.0'
$arch = 'x64'
2020-05-13 22:29:26 +07:00
$ts = $env:PHPTS -eq 'ts'
if($env:PHPTS -ne 'ts') {
$env:PHPTS = 'nts'
}
2020-06-08 04:21:17 +07:00
if(-not(Test-Path -LiteralPath $current_profile)) {
New-Item -Path $current_profile -ItemType "file" -Force >$null 2>&1
}
2019-12-26 20:01:18 +07:00
2020-09-07 04:06:21 +07:00
Add-Printf >$null 2>&1
2019-12-26 20:01:18 +07:00
Step-Log "Setup PhpManager"
2020-03-16 12:48:01 +07:00
Install-PhpManager >$null 2>&1
2019-12-26 20:01:18 +07:00
Add-Log $tick "PhpManager" "Installed"
2020-05-13 22:29:26 +07:00
Step-Log "Setup PHP"
2019-12-26 20:01:18 +07:00
$installed = $null
if (Test-Path -LiteralPath $php_dir -PathType Container) {
try {
$installed = Get-Php -Path $php_dir
2020-05-13 22:29:26 +07:00
} catch { }
}
$status = "Installed"
if ($null -eq $installed -or -not("$($installed.Version).".StartsWith(($version -replace '^(\d+(\.\d+)*).*', '$1.'))) -or $ts -ne $installed.ThreadSafe) {
2019-12-26 20:01:18 +07:00
if ($version -lt '7.0') {
Install-Module -Name VcRedist -Force
$arch='x86'
}
if ($version -eq $master_version) {
$version = 'master'
Invoke-WebRequest -UseBasicParsing -Uri https://dl.bintray.com/shivammathur/php/Install-PhpMaster.ps1 -OutFile $php_dir\Install-PhpMaster.ps1 > $null 2>&1
& $php_dir\Install-PhpMaster.ps1 -Architecture $arch -ThreadSafe $ts -Path $php_dir
} else {
Install-Php -Version $version -Architecture $arch -ThreadSafe $ts -InstallVC -Path $php_dir -TimeZone UTC -InitialPhpIni Production -Force > $null 2>&1
2019-12-26 20:01:18 +07:00
}
} else {
2020-03-01 07:50:48 +07:00
$status = "Found"
2019-12-26 20:01:18 +07:00
}
$installed = Get-Php -Path $php_dir
2019-12-26 20:01:18 +07:00
Set-PhpIniKey -Key 'date.timezone' -Value 'UTC' -Path $php_dir
Set-PhpIniKey -Key 'memory_limit' -Value '-1' -Path $php_dir
2020-05-13 22:29:26 +07:00
Enable-PhpExtension -Extension openssl, curl, opcache, mbstring -Path $php_dir
2019-12-26 20:01:18 +07:00
Update-PhpCAInfo -Path $php_dir -Source CurrentUser
Copy-Item -Path $dist\..\src\configs\*.json -Destination $env:RUNNER_TOOL_CACHE
New-Item -ItemType Directory -Path $composer_bin -Force 2>&1 | Out-Null
Add-Log $tick "PHP" "$status PHP $($installed.FullVersion)"