Files
2026-07-14 11:11:36 +08:00

153 lines
5.1 KiB
PowerShell

# SM-Emby Dev Run Helper
$Device = 'windows'
$Force = $false
$Offline = $false
$RefreshFvpDeps = $false
$SkipDefenderCheck = $false
$FlutterArgs = @()
for ($i = 0; $i -lt $args.Count; $i++) {
$arg = [string]$args[$i]
switch ($arg) {
'-Device' {
$i++
if ($i -ge $args.Count) { throw 'Missing value for -Device' }
$Device = [string]$args[$i]
continue
}
'-Force' { $Force = $true; continue }
'-Offline' { $Offline = $true; continue }
'-RefreshFvpDeps' { $RefreshFvpDeps = $true; continue }
'-SkipDefenderCheck' { $SkipDefenderCheck = $true; continue }
'-FlutterArgs' {
if ($i + 1 -lt $args.Count) { $FlutterArgs = @($args[($i + 1)..($args.Count - 1)]) }
$i = $args.Count
continue
}
'--' {
if ($i + 1 -lt $args.Count) { $FlutterArgs = @($args[($i + 1)..($args.Count - 1)]) }
$i = $args.Count
continue
}
default { throw "Unknown argument: $arg" }
}
}
$ErrorActionPreference = 'Stop'
$repoRoot = Split-Path -Parent $PSScriptRoot
Set-Location $repoRoot
. (Join-Path $PSScriptRoot 'version-common.ps1')
$pubspec = Join-Path $repoRoot 'pubspec.yaml'
$pubspecLock = Join-Path $repoRoot 'pubspec.lock'
$packageConfig = Join-Path $repoRoot '.dart_tool/package_config.json'
$pubGetStamp = Join-Path $repoRoot '.dart_tool/.dev-run-pubget.stamp'
function Get-PubDepsFingerprint {
$parts = @()
foreach ($file in @($pubspec, $pubspecLock)) {
if (Test-Path $file) {
$parts += (Get-FileHash -Path $file -Algorithm SHA256).Hash
} else {
$parts += 'missing'
}
}
return ($parts -join ':')
}
function Need-PubGet {
if ($Force) { return $true }
if (-not (Test-Path $packageConfig)) { return $true }
if (-not (Test-Path $pubspec)) { return $true }
if (-not (Test-Path $pubGetStamp)) { return $true }
$previousFingerprint = (Get-Content -Path $pubGetStamp -Raw -ErrorAction SilentlyContinue).Trim()
return ($previousFingerprint -ne (Get-PubDepsFingerprint))
}
function Save-PubGetStamp {
Set-Content -Path $pubGetStamp -Value (Get-PubDepsFingerprint) -NoNewline -Encoding ASCII
}
function Disable-FvpLatestForDevRun {
if ($Device.ToLowerInvariant() -ne 'windows') { return }
if (-not $Env:FVP_DEPS_LATEST) { return }
Write-Host '[dev-run] 清理 FVP_DEPS_LATEST,使用项目固定版本的 fvp/mdk-sdk' -ForegroundColor Green
$Env:FVP_DEPS_LATEST = $null
}
function Prepare-PinnedFvpWindowsDependencies {
if ($Device.ToLowerInvariant() -ne 'windows') { return }
$prepareScript = Join-Path $PSScriptRoot 'prepare-fvp-windows-deps.ps1'
$prepareArguments = @('-ExecutionPolicy', 'Bypass', '-File', $prepareScript)
if ($RefreshFvpDeps) { $prepareArguments += '-ForceRefresh' }
& powershell @prepareArguments
if ($LASTEXITCODE -ne 0) {
throw "Failed to prepare pinned fvp Windows dependencies (exit $LASTEXITCODE)"
}
}
function Test-DefenderExclusion {
if ($SkipDefenderCheck) { return }
if ($Device.ToLowerInvariant() -ne 'windows') { return }
try {
$pref = Get-MpPreference -ErrorAction Stop
} catch {
return
}
$root = $repoRoot.TrimEnd('\').ToLowerInvariant()
$covered = $false
foreach ($ex in @($pref.ExclusionPath)) {
if ([string]::IsNullOrWhiteSpace($ex)) { continue }
$e = $ex.TrimEnd('\').ToLowerInvariant()
if ($root -eq $e -or $root.StartsWith($e + '\')) { $covered = $true; break }
}
if ($covered) {
Write-Host '[dev-run] Windows Defender 已排除项目目录,原生编译不受实时扫描拖慢' -ForegroundColor Green
return
}
Write-Host '[dev-run] 提示: 项目目录未加入 Windows Defender 排除,原生(fvp/libmdk)编译可能被实时扫描显著拖慢' -ForegroundColor Yellow
Write-Host ' 用【管理员】PowerShell 执行一次即可(之后走缓存):' -ForegroundColor Yellow
Write-Host (' Add-MpPreference -ExclusionPath "' + $repoRoot + '"') -ForegroundColor DarkYellow
Write-Host ' 加 -SkipDefenderCheck 可跳过本提示' -ForegroundColor DarkGray
}
$sw = [System.Diagnostics.Stopwatch]::StartNew()
Disable-FvpLatestForDevRun
Test-DefenderExclusion
if (Need-PubGet) {
Write-Host '[dev-run] 依赖有变更 -> flutter pub get' -ForegroundColor Yellow
$pubArgs = @('pub', 'get')
if ($Offline) { $pubArgs += '--offline' }
& flutter @pubArgs
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
Save-PubGetStamp
} else {
Write-Host '[dev-run] 依赖未变更 -> 跳过 pub get' -ForegroundColor Green
}
Prepare-PinnedFvpWindowsDependencies
$appVersion = Get-SmPlayerCurrentVersion -Platform windows -ProjectRoot $repoRoot
Write-Host "[dev-run] App version: $appVersion (windows/pc line)" -ForegroundColor Cyan
$runArgs = @('run', '-d', $Device, '--no-pub')
if ($FlutterArgs) { $runArgs += $FlutterArgs }
$runArgs = Add-SmPlayerVersionDartDefine -Arguments $runArgs -Version $appVersion
Write-Host "[dev-run] flutter $($runArgs -join ' ')" -ForegroundColor Cyan
Write-Host "[dev-run] 启动准备耗时: $([int]$sw.Elapsed.TotalMilliseconds) ms" -ForegroundColor DarkGray
& flutter @runArgs
exit $LASTEXITCODE