feat: 引入 CloudSync 核心能力并新增 Avalonia 桌面端与发布脚本
- 后端:新增 CloudSync 认证/权限/端点/服务与 DTO - 数据:新增用户/会话/安全策略实体与 EF Core migrations - 前端:新增云同步设置 UI、客户端与本地存储;Vite 支持 maui 构建输出到 wwwroot - 桌面端:新增 Avalonia 项目、内置 WebServer、托盘与 Windows 全局热键 - 发布/构建:新增 Windows/Linux 发布脚本与统一入口;调整 MAUI 资源与安装包配置 - 文档:同步更新 README/docs 与协作规则
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
<#
|
||||
Hua.Todo Linux 发布脚本(产出 .tar.gz)
|
||||
|
||||
目标:
|
||||
- 为 Linux 提供可分发的目录产物(dotnet publish 输出)
|
||||
- 在 Windows 开发机上也能交叉发布 linux-x64(便于 CI 前的本地验证)
|
||||
|
||||
约束:
|
||||
- Avalonia Linux 入口项目需先落地(参见 docs/project/v1.2.0-tasks/01-*)
|
||||
- 仅打包为 tar.gz;Flatpak/AppImage 需要在 Linux 环境执行相关工具链
|
||||
#>
|
||||
|
||||
param(
|
||||
[ValidateSet("linux-x64", "linux-arm64")]
|
||||
[string]$RuntimeIdentifier = "linux-x64",
|
||||
|
||||
[switch]$SelfContained,
|
||||
|
||||
[string]$Configuration = "Release"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
$ScriptPath = $PSScriptRoot
|
||||
|
||||
function Get-FirstExistingFilePath {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string[]]$Candidates
|
||||
)
|
||||
|
||||
foreach ($candidate in $Candidates) {
|
||||
if (Test-Path $candidate) {
|
||||
return $candidate
|
||||
}
|
||||
}
|
||||
|
||||
return $null
|
||||
}
|
||||
|
||||
function Read-ProjectVersion {
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$ProjectFile
|
||||
)
|
||||
|
||||
$currentVersion = "0.0.0"
|
||||
[xml]$csproj = Get-Content $ProjectFile -Raw
|
||||
|
||||
$versionNode = $csproj.SelectSingleNode("//Version")
|
||||
if ($null -ne $versionNode -and -not [string]::IsNullOrWhiteSpace($versionNode.InnerText)) {
|
||||
return $versionNode.InnerText.Trim()
|
||||
}
|
||||
|
||||
$versionNode = $csproj.SelectSingleNode("//ApplicationDisplayVersion")
|
||||
if ($null -ne $versionNode -and -not [string]::IsNullOrWhiteSpace($versionNode.InnerText)) {
|
||||
return $versionNode.InnerText.Trim()
|
||||
}
|
||||
|
||||
return $currentVersion
|
||||
}
|
||||
|
||||
$candidateProjects = @(
|
||||
(Join-Path $ScriptPath "src\Hua.Todo.Avalonia\Hua.Todo.Avalonia.csproj"),
|
||||
(Join-Path $ScriptPath "src\Hua.Todo.Desktop.Avalonia\Hua.Todo.Desktop.Avalonia.csproj")
|
||||
)
|
||||
|
||||
$ProjectFile = Get-FirstExistingFilePath -Candidates $candidateProjects
|
||||
if ($null -eq $ProjectFile) {
|
||||
$candidatesText = ($candidateProjects | ForEach-Object { " - $_" }) -join "`n"
|
||||
Write-Error @"
|
||||
未找到 Avalonia Linux 入口项目(无法生成 Linux 交付产物)。
|
||||
|
||||
请先完成 docs/project/v1.2.0-tasks/01-Linux-Avalonia入口与WebView.md 对应实现,并确保下列路径之一存在:
|
||||
$candidatesText
|
||||
"@
|
||||
exit 1
|
||||
}
|
||||
|
||||
$version = Read-ProjectVersion -ProjectFile $ProjectFile
|
||||
$artifactRoot = Join-Path $ScriptPath "artifacts\linux\$RuntimeIdentifier"
|
||||
$publishDir = Join-Path $artifactRoot "publish"
|
||||
|
||||
if (Test-Path $artifactRoot) {
|
||||
Remove-Item -Recurse -Force $artifactRoot
|
||||
}
|
||||
New-Item -ItemType Directory -Path $publishDir | Out-Null
|
||||
|
||||
$selfContainedValue = if ($SelfContained.IsPresent) { "true" } else { "false" }
|
||||
|
||||
Write-Host "Publishing (RID=$RuntimeIdentifier, SelfContained=$selfContainedValue)..." -ForegroundColor Cyan
|
||||
|
||||
dotnet publish $ProjectFile `
|
||||
-c $Configuration `
|
||||
-r $RuntimeIdentifier `
|
||||
--self-contained $selfContainedValue `
|
||||
-o $publishDir
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "dotnet publish failed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
$packageName = "hua.todo-$version-$RuntimeIdentifier.tar.gz"
|
||||
$packagePath = Join-Path $artifactRoot $packageName
|
||||
|
||||
Write-Host "Creating tar.gz: $packageName" -ForegroundColor Cyan
|
||||
tar -C $publishDir -czf $packagePath .
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "tar.gz packaging failed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Linux artifact created: $packagePath" -ForegroundColor Green
|
||||
Reference in New Issue
Block a user