275 lines
9.9 KiB
PowerShell
275 lines
9.9 KiB
PowerShell
# minimax-docx Environment Setup & Initialization Script (Windows PowerShell)
|
|
# Supports: Windows 10/11, Windows Server 2019+
|
|
# License: MIT
|
|
#Requires -Version 5.1
|
|
|
|
param(
|
|
[switch]$Minimal,
|
|
[switch]$SkipVerify,
|
|
[switch]$Help
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
|
$ProjectDir = Split-Path -Parent $ScriptDir
|
|
$DotnetDir = Join-Path $ScriptDir "dotnet"
|
|
$LogFile = Join-Path $ProjectDir ".setup.log"
|
|
|
|
# --- Output Helpers ---
|
|
function Log { Write-Host "[OK] $args" -ForegroundColor Green }
|
|
function Warn { Write-Host "[WARN] $args" -ForegroundColor Yellow }
|
|
function Fail { Write-Host "[FAIL] $args" -ForegroundColor Red }
|
|
function Info { Write-Host "[INFO] $args" -ForegroundColor Cyan }
|
|
function Step { Write-Host "`n=== $args ===" -ForegroundColor Blue }
|
|
|
|
if ($Help) {
|
|
Write-Host @"
|
|
Usage: setup.ps1 [options]
|
|
-Minimal Only install critical dependencies (skip pandoc, soffice, fonts)
|
|
-SkipVerify Skip the verification test at the end
|
|
-Help Show this help
|
|
"@
|
|
exit 0
|
|
}
|
|
|
|
Write-Host "============================================"
|
|
Write-Host " minimax-docx Setup & Initialization (Windows)"
|
|
Write-Host " $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
|
|
Write-Host "============================================"
|
|
|
|
"" | Set-Content $LogFile
|
|
|
|
# --- Detect Package Manager ---
|
|
$HasWinget = $null -ne (Get-Command winget -ErrorAction SilentlyContinue)
|
|
$HasChoco = $null -ne (Get-Command choco -ErrorAction SilentlyContinue)
|
|
$HasScoop = $null -ne (Get-Command scoop -ErrorAction SilentlyContinue)
|
|
|
|
if ($HasWinget) { Info "Package manager: winget" }
|
|
elseif ($HasChoco) { Info "Package manager: chocolatey" }
|
|
elseif ($HasScoop) { Info "Package manager: scoop" }
|
|
else { Warn "No package manager found (winget/choco/scoop). Manual install may be needed." }
|
|
|
|
# --- .NET SDK ---
|
|
Step "Checking .NET SDK"
|
|
|
|
$dotnetCmd = Get-Command dotnet -ErrorAction SilentlyContinue
|
|
if ($dotnetCmd) {
|
|
$dotnetVer = & dotnet --version 2>$null
|
|
$majorVer = [int]($dotnetVer -split '\.')[0]
|
|
if ($majorVer -ge 8) {
|
|
Log "dotnet $dotnetVer already installed (>= 8.0 OK)"
|
|
} else {
|
|
Warn "dotnet $dotnetVer found but < 8.0, upgrading..."
|
|
$dotnetCmd = $null
|
|
}
|
|
}
|
|
|
|
if (-not $dotnetCmd -or $majorVer -lt 8) {
|
|
Info "Installing .NET SDK..."
|
|
if ($HasWinget) {
|
|
winget install Microsoft.DotNet.SDK.8 --accept-source-agreements --accept-package-agreements 2>>$LogFile
|
|
} elseif ($HasChoco) {
|
|
choco install dotnet-sdk -y 2>>$LogFile
|
|
} elseif ($HasScoop) {
|
|
scoop install dotnet-sdk 2>>$LogFile
|
|
} else {
|
|
Fail "Cannot auto-install .NET SDK. Download from: https://dotnet.microsoft.com/download"
|
|
Fail "After installing, restart PowerShell and re-run this script."
|
|
exit 1
|
|
}
|
|
|
|
# Refresh PATH
|
|
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
|
|
|
if (Get-Command dotnet -ErrorAction SilentlyContinue) {
|
|
Log "dotnet $(dotnet --version) installed"
|
|
} else {
|
|
Fail "dotnet installation failed. Restart PowerShell and retry, or install manually."
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# --- Pandoc (Optional) ---
|
|
if (-not $Minimal) {
|
|
Step "Checking pandoc (optional: content preview)"
|
|
|
|
if (Get-Command pandoc -ErrorAction SilentlyContinue) {
|
|
$pandocVer = (pandoc --version | Select-Object -First 1) -replace '.*?(\d+\.\d+(\.\d+)?)', '$1'
|
|
Log "pandoc $pandocVer already installed"
|
|
} else {
|
|
Info "Installing pandoc..."
|
|
if ($HasWinget) { winget install JohnMacFarlane.Pandoc --accept-source-agreements 2>>$LogFile }
|
|
elseif ($HasChoco) { choco install pandoc -y 2>>$LogFile }
|
|
elseif ($HasScoop) { scoop install pandoc 2>>$LogFile }
|
|
else { Warn "Install pandoc manually: https://pandoc.org/installing.html" }
|
|
|
|
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
|
|
|
|
if (Get-Command pandoc -ErrorAction SilentlyContinue) {
|
|
Log "pandoc installed"
|
|
} else {
|
|
Warn "pandoc not found after install (optional, will degrade gracefully)"
|
|
}
|
|
}
|
|
}
|
|
|
|
# --- LibreOffice (Optional) ---
|
|
if (-not $Minimal) {
|
|
Step "Checking LibreOffice/soffice (optional: .doc conversion)"
|
|
|
|
$sofficeFound = $false
|
|
|
|
# Check common Windows install paths
|
|
$sofficePaths = @(
|
|
"C:\Program Files\LibreOffice\program\soffice.exe",
|
|
"C:\Program Files (x86)\LibreOffice\program\soffice.exe",
|
|
"${env:LOCALAPPDATA}\Programs\LibreOffice\program\soffice.exe"
|
|
)
|
|
|
|
if (Get-Command soffice -ErrorAction SilentlyContinue) {
|
|
Log "soffice found in PATH"
|
|
$sofficeFound = $true
|
|
} else {
|
|
foreach ($p in $sofficePaths) {
|
|
if (Test-Path $p) {
|
|
Log "soffice found at: $p"
|
|
Info "Tip: Add to PATH: `$env:Path += ';$(Split-Path $p)'"
|
|
$sofficeFound = $true
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if (-not $sofficeFound) {
|
|
Info "Installing LibreOffice (this may take a while)..."
|
|
if ($HasWinget) { winget install TheDocumentFoundation.LibreOffice --accept-source-agreements 2>>$LogFile }
|
|
elseif ($HasChoco) { choco install libreoffice-fresh -y 2>>$LogFile }
|
|
else { Warn "Install LibreOffice manually: https://www.libreoffice.org/download/" }
|
|
}
|
|
}
|
|
|
|
# --- NuGet Configuration ---
|
|
Step "Checking NuGet configuration"
|
|
|
|
$nugetSources = & dotnet nuget list source 2>$null
|
|
if ($nugetSources -match "nuget.org") {
|
|
Log "nuget.org source is configured"
|
|
} else {
|
|
Warn "nuget.org not in sources. Adding..."
|
|
& dotnet nuget add source "https://api.nuget.org/v3/index.json" --name "nuget.org" 2>>$LogFile
|
|
}
|
|
|
|
# --- Encoding Check ---
|
|
Step "Checking console encoding"
|
|
|
|
$currentEncoding = [Console]::OutputEncoding.EncodingName
|
|
if ($currentEncoding -match "UTF-8|Unicode") {
|
|
Log "Console encoding: $currentEncoding (UTF-8 compatible)"
|
|
} else {
|
|
Warn "Console encoding: $currentEncoding (may cause issues with CJK text)"
|
|
Info "To fix: [Console]::OutputEncoding = [System.Text.Encoding]::UTF8"
|
|
Info "Or set system-wide: Settings > Time & Language > Language > Administrative > Change system locale > Beta: UTF-8"
|
|
# Apply for this session
|
|
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
|
Log "Set UTF-8 encoding for this session"
|
|
}
|
|
|
|
# --- Font Check ---
|
|
if (-not $Minimal) {
|
|
Step "Checking fonts"
|
|
|
|
$fonts = [System.Drawing.FontFamily]::Families 2>$null
|
|
if ($fonts) {
|
|
$fontNames = $fonts | ForEach-Object { $_.Name }
|
|
$hasCalibri = $fontNames -contains "Calibri"
|
|
$hasTimes = $fontNames -contains "Times New Roman"
|
|
$hasCJK = ($fontNames | Where-Object { $_ -match "SimSun|Microsoft YaHei|MS Mincho|Malgun Gothic" }).Count -gt 0
|
|
|
|
if ($hasCalibri) { Log "Western fonts: Calibri found" } else { Warn "Calibri not found (install Microsoft Office or fonts)" }
|
|
if ($hasTimes) { Log "Western fonts: Times New Roman found" } else { Warn "Times New Roman not found" }
|
|
if ($hasCJK) { Log "CJK fonts: available" } else { Warn "CJK fonts not found (install language packs for Chinese/Japanese/Korean)" }
|
|
} else {
|
|
Info "Cannot enumerate fonts (System.Drawing not loaded). Skipping font check."
|
|
}
|
|
}
|
|
|
|
# --- Build Project ---
|
|
Step "Building minimax-docx .NET project"
|
|
|
|
if (-not (Test-Path $DotnetDir)) {
|
|
Fail "Dotnet project directory not found: $DotnetDir"
|
|
exit 1
|
|
}
|
|
|
|
Push-Location $DotnetDir
|
|
|
|
Info "Restoring NuGet packages..."
|
|
$restoreResult = & dotnet restore --verbosity quiet 2>&1
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Fail "NuGet restore failed:"
|
|
$restoreResult | ForEach-Object { Fail " $_" }
|
|
Fail "Common causes:"
|
|
Fail " - No internet (NuGet needs to download packages)"
|
|
Fail " - Corporate proxy/firewall blocking nuget.org"
|
|
Fail " - Insufficient disk space"
|
|
Fail "Try: dotnet restore --verbosity detailed"
|
|
Pop-Location
|
|
exit 1
|
|
}
|
|
Log "NuGet packages restored"
|
|
|
|
Info "Building project..."
|
|
$buildResult = & dotnet build --verbosity quiet --no-restore 2>&1
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Fail "Build failed:"
|
|
$buildResult | ForEach-Object { Fail " $_" }
|
|
Pop-Location
|
|
exit 1
|
|
}
|
|
Log "Project built successfully"
|
|
|
|
Pop-Location
|
|
|
|
# --- Verification ---
|
|
if (-not $SkipVerify) {
|
|
Step "Verification Test"
|
|
|
|
$testOutput = Join-Path $env:TEMP "minimax-docx-setup-test-$PID.docx"
|
|
|
|
Info "Creating a test document..."
|
|
Push-Location $DotnetDir
|
|
$testResult = & dotnet run --project MiniMaxAIDocx.Cli -- create --type report --output $testOutput --title "Setup Test" 2>&1
|
|
$testExitCode = $LASTEXITCODE
|
|
Pop-Location
|
|
|
|
if ($testExitCode -eq 0 -and (Test-Path $testOutput)) {
|
|
Log "Test document created: $testOutput"
|
|
|
|
if (Get-Command pandoc -ErrorAction SilentlyContinue) {
|
|
$preview = & pandoc -f docx -t plain $testOutput 2>$null | Select-Object -First 3
|
|
if ($preview) { Log "Preview working: `"$($preview -join ' ')`"" }
|
|
}
|
|
|
|
Remove-Item $testOutput -Force
|
|
Log "Test passed - minimax-docx is ready to use!"
|
|
} else {
|
|
Fail "Test document creation failed. Output:"
|
|
$testResult | ForEach-Object { Fail " $_" }
|
|
}
|
|
}
|
|
|
|
# --- Summary ---
|
|
Step "Setup Complete"
|
|
|
|
Write-Host ""
|
|
Write-Host " Environment: Windows $([System.Environment]::OSVersion.Version)"
|
|
Write-Host " .NET SDK: $(dotnet --version 2>$null)"
|
|
$pandocInfo = if (Get-Command pandoc -ErrorAction SilentlyContinue) { pandoc --version | Select-Object -First 1 } else { "not installed (optional)" }
|
|
Write-Host " pandoc: $pandocInfo"
|
|
Write-Host " Project: $DotnetDir"
|
|
Write-Host ""
|
|
Write-Host " Usage:"
|
|
Write-Host " dotnet run --project $DotnetDir\MiniMaxAIDocx.Cli -- create --type report --output my_report.docx"
|
|
Write-Host ""
|
|
Write-Host " Log file: $LogFile"
|