153 lines
5.1 KiB
PowerShell
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
|