Files
ChuSQL/scripts/install.ps1
T
LIm1tZz7 df6d348995 大更新:
1、完善SQL语法
2、移除node前端,只保留静态资源
3、写好安装脚本
4、做好linux适配
2026-10-01 20:48:38 +08:00

125 lines
5.2 KiB
PowerShell

# ChuSQL 安装脚本(Windows)。
#
# 包目录结构(解压后就是这个样子):
# bin/ chusql-storage.exe(必装)、chusql-web.exe 或 csql.exe(二选一)
# static/ Web 前端静态资源(装 web 组件时带)
# scripts/ chusql.toml、init.sql
# csql-web.ps1
# install.ps1
#
# 安装 = 释放到目标目录 + 配好环境变量 + 写全局配置,装完把包目录删掉。
# storage/engine 一定装;web 与 cli 二选一。
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][ValidateSet('web', 'cli')][string]$Component,
[string]$InstallDir = '',
[string]$DataDir = '',
[string]$RootUser = 'root',
[string]$RootPassword = '',
[switch]$KeepPackage
)
$ErrorActionPreference = 'Stop'
function Fail([string]$msg) { Write-Host "!! $msg" -ForegroundColor Red; exit 1 }
function Step([string]$msg) { Write-Host ''; Write-Host "==> $msg" -ForegroundColor Cyan }
function Say([string]$msg) { Write-Host $msg }
$pack = Split-Path -Parent $MyInvocation.MyCommand.Path
if (-not $InstallDir) { $InstallDir = Join-Path $env:LOCALAPPDATA 'ChuSQL' }
if (-not $DataDir) { $DataDir = Join-Path $InstallDir 'data' }
$InstallDir = [System.IO.Path]::GetFullPath($InstallDir)
$DataDir = [System.IO.Path]::GetFullPath($DataDir)
# ---- 校验包内容 ----
$storageExe = Join-Path $pack 'bin\chusql-storage.exe'
if (-not (Test-Path $storageExe)) { Fail "package is incomplete: bin\chusql-storage.exe not found in $pack" }
if ($Component -eq 'web') {
if (-not (Test-Path (Join-Path $pack 'bin\chusql-web.exe'))) { Fail 'package is incomplete: bin\chusql-web.exe not found' }
if (-not (Test-Path (Join-Path $pack 'static'))) { Fail 'package is incomplete: static\ not found' }
} else {
if (-not (Test-Path (Join-Path $pack 'bin\csql.exe'))) { Fail 'package is incomplete: bin\csql.exe not found' }
}
$template = Join-Path $pack 'scripts\chusql.toml'
if (-not (Test-Path $template)) { Fail 'package is incomplete: scripts\chusql.toml not found' }
Say "ChuSQL installer"
Say (" component {0}" -f $Component)
Say (" install to {0}" -f $InstallDir)
Say (" data dir {0}" -f $DataDir)
Say (" root user {0}{1}" -f $RootUser, $(if ($RootPassword) { '' } else { ' (no password: administrator-only sign-in)' }))
# ---- 释放文件 ----
Step 'Installing files'
New-Item -ItemType Directory -Force -Path (Join-Path $InstallDir 'bin'), (Join-Path $InstallDir 'logs'), $DataDir | Out-Null
Copy-Item (Join-Path $pack 'bin\*') (Join-Path $InstallDir 'bin') -Recurse -Force
if ($Component -eq 'web') {
New-Item -ItemType Directory -Force -Path (Join-Path $InstallDir 'static') | Out-Null
Copy-Item (Join-Path $pack 'static\*') (Join-Path $InstallDir 'static') -Recurse -Force
$launcher = Join-Path $pack 'csql-web.ps1'
if (Test-Path $launcher) {
Copy-Item $launcher $InstallDir -Force
} else {
Say ' note: csql-web.ps1 is not bundled yet; until it is, start bin\chusql-web.exe yourself'
}
}
# ---- 写全局配置 ----
Step 'Writing chusql.toml'
$configDir = if ($env:APPDATA) { Join-Path $env:APPDATA 'ChuSQL' } else { Join-Path $InstallDir 'config' }
$configFile = Join-Path $configDir 'chusql.toml'
$toml = Get-Content -Path $template -Raw -Encoding UTF8
$toml = $toml -replace '(?m)^(\s*user\s*=\s*).*$', "`$1`"$RootUser`""
$toml = $toml -replace '(?m)^(\s*password\s*=\s*).*$', "`$1`"$RootPassword`""
$toml = $toml -replace '(?m)^(\s*data_dir\s*=\s*).*$', "`$1`"$($DataDir -replace '\\', '/')`""
New-Item -ItemType Directory -Force -Path $configDir | Out-Null
Set-Content -Path $configFile -Value $toml -Encoding UTF8
Say (" config file {0}" -f $configFile)
Copy-Item (Join-Path $pack 'scripts\init.sql') $InstallDir -Force -ErrorAction SilentlyContinue
# ---- 命令入口 ----
Step 'Creating commands'
if ($Component -eq 'web') {
Set-Content -Path (Join-Path $InstallDir 'csql-web.cmd') -Encoding ASCII -Value @'
@echo off
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0csql-web.ps1" %*
'@
} else {
Set-Content -Path (Join-Path $InstallDir 'csql.cmd') -Encoding ASCII -Value @'
@echo off
"%~dp0bin\csql.exe" %*
'@
}
# ---- 环境变量 ----
Step 'Updating PATH'
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
if (-not $userPath) { $userPath = '' }
$entries = $userPath -split ';' | Where-Object { $_ }
if ($entries -notcontains $InstallDir) {
$updated = (@($entries) + $InstallDir) -join ';'
[Environment]::SetEnvironmentVariable('Path', $updated, 'User')
Say ("added {0} to the user PATH (open a new terminal to pick it up)" -f $InstallDir)
} else {
Say 'PATH already has the install directory'
}
# ---- 删掉安装包 ----
if (-not $KeepPackage) {
Step 'Removing the package'
$marker = Join-Path $pack 'bin\chusql-storage.exe'
$safe = (Test-Path $marker) -and ($pack -ne $InstallDir) -and (-not $InstallDir.StartsWith($pack, [StringComparison]::OrdinalIgnoreCase))
if ($safe) {
Remove-Item -Recurse -Force $pack
Say 'package removed'
} else {
Say ("kept the package (not safe to delete automatically): {0}" -f $pack)
}
}
Step 'Done'
Say (" chusql.toml {0}" -f $configFile)
Say (" data {0}" -f $DataDir)
if ($Component -eq 'web') { Say ' start with csql-web' } else { Say ' start with csql' }