Initial commit
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user