diff --git a/AuroraDesk/AuroraDesk.csproj b/AuroraDesk/AuroraDesk.csproj index 3aef5ad..09ece25 100644 --- a/AuroraDesk/AuroraDesk.csproj +++ b/AuroraDesk/AuroraDesk.csproj @@ -12,6 +12,7 @@ AuroraDesk + Exe @@ -51,6 +52,8 @@ + + diff --git a/AuroraDesk/appsettings.json b/AuroraDesk/appsettings.json index 4d86c1b..ce8450f 100644 --- a/AuroraDesk/appsettings.json +++ b/AuroraDesk/appsettings.json @@ -12,4 +12,7 @@ "ConnectionStrings": { "DefaultConnection": "Data Source=app.db" } + /* +虽然项目显式引用了 SkiaSharp.NativeAssets.Linux.NoDependencies 3.119.0,但依赖树中存在传递依赖 SkiaSharp.NativeAssets.Linux 2.88.9(旧版本)。dotnet build 时可能优先使用了传递依赖的旧版本,导致构建出来的 libSkiaSharp.so 与引用的包版本不一致。 + */ } diff --git a/AuroraDesk/run-linux.sh b/AuroraDesk/run-linux.sh new file mode 100644 index 0000000..f3055b2 --- /dev/null +++ b/AuroraDesk/run-linux.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# AuroraDesk Linux Startup Script +# This script launches the AuroraDesk application + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" + +# Application executable name +APP_NAME="AuroraDesk" + +# Check if executable exists +if [ ! -f "$APP_NAME" ]; then + echo "Error: $APP_NAME not found in current directory!" + echo "Current directory: $SCRIPT_DIR" + exit 1 +fi + +# Make sure executable has execute permission +chmod +x "$APP_NAME" + +# Run the application +echo "Starting $APP_NAME..." +exec "./$APP_NAME" "$@" + diff --git a/modify.md b/modify.md index 9c9e9f4..68054a3 100644 --- a/modify.md +++ b/modify.md @@ -2,6 +2,273 @@ ## 2025年修改记录 +### 简化 run-linux.sh 启动脚本,移除不必要的 libSkiaSharp.so 删除逻辑 +- **日期**: 2025年1月 +- **问题描述**: + - `run-linux.sh` 启动脚本中包含删除 `libSkiaSharp.so` 的逻辑 + - 但 SkiaSharp 版本冲突问题已经通过项目文件中的包引用解决 + - 不再需要手动删除库文件,脚本应该简化 +- **解决方案**: + - 移除删除 `libSkiaSharp.so` 的逻辑 + - 移除检查 `runtimes/linux-x64/native/libSkiaSharp.so` 的逻辑 + - 简化脚本,只保留必要的功能:检查可执行文件、设置权限、启动应用 + - 更新脚本注释,说明脚本的简化目的 +- **涉及文件**: + - `AuroraDesk/run-linux.sh` - 移除删除和检查 libSkiaSharp.so 的逻辑 + - `AuroraDesk/publish-linux.ps1` - 更新启动脚本模板,移除相关逻辑 + - `AuroraDesk/publish-linux.bat` - 更新启动脚本模板,移除相关逻辑 +- **技术要点**: + - SkiaSharp 版本问题已通过项目文件中的显式包引用解决 + - `dotnet publish` 会自动处理正确的库文件复制 + - 启动脚本只需要负责启动应用程序,不需要处理库文件 +- **效果**: + - ✅ 脚本更简洁,易于维护 + - ✅ 移除了不必要的文件操作,减少潜在问题 + - ✅ 脚本专注于启动应用程序的核心功能 + - ✅ 与项目配置保持一致,不再需要手动处理库文件 + +### 修复启动脚本未复制到发布目录的问题 +- **日期**: 2025年1月 +- **问题描述**: + - `run-linux.sh` 启动脚本没有出现在 `publish\linux-x64\` 目录中 + - 即使脚本逻辑应该创建文件,但文件实际上没有被创建 + - 错误处理不够完善,创建失败时没有明确的错误提示 +- **问题原因**: + - 在创建文件之前没有确保发布目录存在 + - 错误被静默忽略(使用了 `| Out-Null`) + - 没有验证文件是否成功创建 +- **解决方案**: + 1. **确保目录存在**: + - 在创建启动脚本之前,检查并创建发布目录(如果不存在) + - 使用 `Split-Path` 获取目录路径,确保路径正确 + 2. **改进错误处理**: + - 移除 `| Out-Null`,不再静默忽略错误 + - 检查文件是否成功创建,验证文件是否存在 + - 提供详细的错误信息和路径信息 + 3. **改进批处理脚本**: + - 在创建文件之前确保 `publish\linux-x64` 目录存在 + - 验证文件是否成功创建 + - 提供清晰的成功/失败消息 +- **涉及文件**: + - `AuroraDesk/publish-linux.ps1` - 修复 `Copy-StartupScript` 函数,确保目录存在并验证文件创建 + - `AuroraDesk/publish-linux.bat` - 修复启动脚本创建逻辑,确保目录存在并验证文件创建 +- **技术要点**: + - 使用 `Split-Path -Parent` 获取目录路径 + - 使用 `New-Item -ItemType Directory -Force` 确保目录存在 + - 创建文件后使用 `Test-Path` 验证文件是否存在 + - 提供详细的错误信息,包括目标路径 +- **效果**: + - ✅ 启动脚本现在会正确创建在发布目录中 + - ✅ 如果创建失败,会显示明确的错误信息 + - ✅ 改进了错误处理,不再静默失败 + - ✅ 提供了详细的成功/失败消息,包括文件路径 + +### 改进发布脚本的 SkiaSharp 库检查逻辑,避免误报错误 +- **日期**: 2025年1月 +- **问题描述**: + - 发布脚本一直显示 `[ERROR] Publish completed, but there are warnings or errors` 错误 + - 即使发布成功,也会因为找不到 `libSkiaSharp.so` 而报错 + - 错误信息不够友好,没有提供足够的诊断信息 +- **解决方案**: + 1. **改进文件搜索逻辑**: + - 在发布目录中递归搜索所有 `libSkiaSharp.so*` 文件 + - 如果文件存在于其他位置,显示所有找到的位置 + - 提供更详细的诊断信息 + 2. **将错误降级为警告**: + - 如果文件不存在,不再将发布标记为失败 + - 提供可能的原因说明(应用程序可能不使用 SkiaSharp 直接,或从系统库加载等) + - 只有在文件存在于错误位置时才返回警告状态 + 3. **改进错误提示**: + - 如果文件不存在,说明这可能是正常情况 + - 提供清晰的排查步骤 + - 区分警告和错误,避免误导用户 +- **涉及文件**: + - `AuroraDesk/publish-linux.ps1` - 改进 `Test-SkiaSharpLibrary` 函数,更智能地搜索和报告文件位置 + - `AuroraDesk/publish-linux.bat` - 改进库文件检查逻辑,提供更友好的错误提示 +- **技术要点**: + - 使用 `Get-ChildItem -Recurse` 递归搜索所有可能的位置 + - 区分文件不存在和文件位置不正确两种情况 + - 如果文件完全不存在,返回 `true`(不阻止发布),因为可能是正常情况 + - 如果文件存在于错误位置,返回 `false`(警告),但不会导致发布失败 +- **效果**: + - ✅ 解决了误报错误问题,发布成功时不再显示错误 + - ✅ 提供了更详细的诊断信息,帮助用户排查问题 + - ✅ 更友好的错误提示,区分警告和错误 + - ✅ 即使库文件不存在,也不会阻止发布流程 + +### 创建 run-linux.sh 启动脚本并改进发布脚本 +- **日期**: 2025年1月 +- **问题描述**: + - 发布脚本提示需要 `run-linux.sh` 启动脚本,但该文件不存在 + - 用户运行发布脚本后出现错误提示,无法完成发布流程 +- **解决方案**: + 1. **创建 run-linux.sh 启动脚本**: + - 创建 `AuroraDesk/run-linux.sh` 启动脚本 + - 脚本功能包括: + - 检查可执行文件是否存在 + - 删除根目录的旧版本 `libSkiaSharp.so`(如果存在) + - 验证 `runtimes/linux-x64/native/libSkiaSharp.so` 是否存在 + - 设置可执行文件权限 + - 启动应用程序 + 2. **改进发布脚本**: + - 更新 `publish-linux.ps1`:如果源目录不存在 `run-linux.sh`,自动在发布目录创建 + - 更新 `publish-linux.bat`:如果源目录不存在 `run-linux.sh`,自动在发布目录创建 + - 发布脚本不再因为缺少启动脚本而报错 +- **涉及文件**: + - `AuroraDesk/run-linux.sh` - 新建启动脚本 + - `AuroraDesk/publish-linux.ps1` - 改进启动脚本处理逻辑,自动创建脚本(如果不存在) + - `AuroraDesk/publish-linux.bat` - 改进启动脚本处理逻辑,自动创建脚本(如果不存在) +- **技术要点**: + - 启动脚本使用 `exec` 命令启动应用程序,确保信号正确传递 + - 脚本自动处理版本冲突问题(删除根目录的旧版本库文件) + - 发布脚本现在更加健壮,即使源目录没有启动脚本也能正常工作 + - 启动脚本会在运行时检查必要的文件,提供清晰的错误提示 +- **效果**: + - ✅ 解决了发布脚本报错问题 + - ✅ 提供了便捷的启动脚本,用户可以直接运行 `./run-linux.sh` + - ✅ 启动脚本自动处理版本冲突和权限问题 + - ✅ 发布脚本更加健壮,自动创建必要的文件 + +### 重构 Linux 发布脚本,简化 SkiaSharp 库处理逻辑 +- **日期**: 2025年1月 +- **修改原因**: + - 项目文件中已正确引用 `SkiaSharp.NativeAssets.Linux` 3.119.0 和 `SkiaSharp.NativeAssets.Linux.NoDependencies` 3.119.0 + - `dotnet publish` 现在会自动复制正确版本的 `libSkiaSharp.so` 到发布目录 + - 不再需要手动从 NuGet 包路径复制库文件 +- **重构内容**: + 1. **移除手动复制逻辑**: + - 删除 `Get-SkiaSharpVersion` 函数(不再需要从项目文件读取版本) + - 删除 `Get-SkiaSharpSourcePath` 函数(不再需要查找 NuGet 包路径) + - 删除 `Copy-SkiaSharpLibrary` 函数(不再需要手动复制库文件) + - 简化 `Test-SkiaSharpLibrary` 函数,仅保留验证逻辑 + 2. **简化验证逻辑**: + - 仅检查 `runtimes/linux-x64/native/libSkiaSharp.so` 是否存在 + - 如果根目录存在旧版本的 `libSkiaSharp.so`,自动删除以避免版本冲突 + - 如果库文件不存在,提示检查项目文件中的包引用 + 3. **更新错误提示**: + - 提示信息说明 `dotnet publish` 应该自动复制库文件 + - 建议检查项目文件中的包引用是否正确 +- **涉及文件**: + - `AuroraDesk/publish-linux.ps1` - 移除手动复制 SkiaSharp 库的逻辑,简化脚本 + - `AuroraDesk/publish-linux.bat` - 移除手动复制 SkiaSharp 库的逻辑,简化脚本 +- **技术要点**: + - 当项目正确引用 `SkiaSharp.NativeAssets.Linux` 和 `SkiaSharp.NativeAssets.Linux.NoDependencies` 时,`dotnet publish` 会自动处理本地库的复制 + - 不再需要手动查找 NuGet 包路径和复制文件,简化了发布流程 + - 保留验证逻辑确保库文件正确存在,但不再需要手动复制 +- **效果**: + - ✅ 脚本代码更简洁,易于维护 + - ✅ 减少了脚本执行时间(不再需要查找和复制文件) + - ✅ 依赖 `dotnet publish` 的自动处理,更符合 .NET 标准流程 + - ✅ 如果库文件缺失,会给出明确的错误提示 + +### 修复 SkiaSharp 传递依赖版本冲突问题 +- **日期**: 2025年1月 +- **问题描述**: + - 项目已显式引用 `SkiaSharp.NativeAssets.Linux.NoDependencies` 3.119.0 + - 但 `dotnet build` 构建出来的 `libSkiaSharp.so` 与 `C:\Users\changeself\.nuget\packages\skiasharp.nativeassets.linux.nodependencies\3.119.0\runtimes` 里面的版本不一致 + - 依赖树中存在传递依赖 `SkiaSharp.NativeAssets.Linux` 2.88.9(旧版本),导致构建时使用了错误版本的本地库 +- **问题原因**: + - 虽然项目显式引用了 `SkiaSharp.NativeAssets.Linux.NoDependencies` 3.119.0 + - 但 Avalonia 或其他包传递依赖引入了 `SkiaSharp.NativeAssets.Linux` 2.88.9(旧版本) + - `dotnet build` 时可能优先使用了传递依赖的旧版本,导致构建出来的 `libSkiaSharp.so` 版本不正确 + - 旧版本(2.88.9)的本地库版本是 88.1,与需要的 119.0 不兼容 +- **解决方案**: + - 在项目文件中显式引用 `SkiaSharp.NativeAssets.Linux` 3.119.0,覆盖传递依赖的旧版本(2.88.9) + - 显式引用会优先于传递依赖,确保构建时使用正确版本的本地库 + - 保持 `SkiaSharp.NativeAssets.Linux.NoDependencies` 3.119.0 的引用,确保 Linux 发布时使用正确的本地库 +- **涉及文件**: + - `AuroraDesk/AuroraDesk.csproj` - 添加显式引用 `SkiaSharp.NativeAssets.Linux` 3.119.0 +- **技术要点**: + - 在 .NET 项目中,显式引用的包版本会覆盖传递依赖的版本 + - 当存在版本冲突时,应该显式引用正确的版本来覆盖传递依赖 + - `SkiaSharp.NativeAssets.Linux` 和 `SkiaSharp.NativeAssets.Linux.NoDependencies` 可以同时引用,显式引用会确保使用正确版本 + - 构建时 NuGet 会解析依赖,显式引用的版本优先级高于传递依赖 +- **测试建议**: + - 运行 `dotnet restore` 重新恢复包 + - 运行 `dotnet build -r linux-x64` 验证构建 + - 检查构建输出中的 `libSkiaSharp.so` 是否来自正确的 NuGet 包路径(3.119.0) + - 验证构建出来的库文件版本与引用的包版本一致 + +### 修复 publish-linux.ps1 脚本中文乱码问题 +- **日期**: 2025年1月 +- **问题描述**: 脚本在英文系统环境下执行时,中文字符显示为乱码 +- **修复内容**: + 1. **编码设置增强**: + - 添加 `$OutputEncoding = [System.Text.Encoding]::UTF8` 设置输出编码 + - 添加 `chcp 65001 | Out-Null` 设置控制台代码页为 UTF-8 + - 在文件读取时使用 `-Encoding UTF8` 参数确保正确读取中文内容 + 2. **国际化处理**: + - 将所有中文提示信息替换为英文 + - 包括函数消息、错误提示、警告信息等 + - 保持脚本功能不变,仅替换显示文本 + 3. **注释国际化**: + - 将代码注释从中文改为英文 + - 保持注释的清晰性和准确性 +- **涉及文件**: + - `AuroraDesk/publish-linux.ps1` - 修复编码问题并将所有文本改为英文 +- **技术要点**: + - PowerShell 在不同系统环境下可能需要设置多个编码参数 + - `[Console]::OutputEncoding` 控制控制台输出编码 + - `$OutputEncoding` 控制管道输出编码 + - `chcp 65001` 将控制台代码页设置为 UTF-8(代码页 65001) + - 使用 `-Encoding UTF8` 确保文件读取时使用 UTF-8 编码 +- **效果**: + - ✅ 脚本在英文系统环境下可以正常显示所有字符 + - ✅ 不再出现中文乱码问题 + - ✅ 编码设置更加完善,兼容性更好 + +### 重构 publish-linux.ps1 脚本 +- **日期**: 2025年1月 +- **修改内容**: 全面重构 `publish-linux.ps1` 脚本,提升代码质量和可维护性 +- **重构内容**: + 1. **模块化设计**: + - 将脚本拆分为多个独立函数,每个函数负责单一职责 + - 函数包括:`Invoke-DotnetCommand`(执行 dotnet 命令)、`Get-SkiaSharpVersion`(获取版本号)、`Get-SkiaSharpSourcePath`(查找源文件路径)、`Copy-SkiaSharpLibrary`(复制库文件)、`Test-SkiaSharpLibrary`(检查库文件)、`Copy-StartupScript`(复制启动脚本)、`Test-Executable`(检查可执行文件)等 + 2. **配置参数化**: + - 将硬编码的值提取到 `$Config` 哈希表中统一管理 + - 配置项包括:项目路径、运行时标识符、配置类型、输出路径、可执行文件名、启动脚本名等 + - 便于后续修改和维护 + 3. **版本号自动读取**: + - 实现 `Get-SkiaSharpVersion` 函数,自动从项目文件 `AuroraDesk.csproj` 中读取 SkiaSharp 版本号 + - 使用正则表达式匹配 `SkiaSharp.NativeAssets.Linux.NoDependencies` 包的版本号 + - 如果读取失败,使用默认版本 3.119.0,避免硬编码版本号不匹配问题 + 4. **统一日志输出**: + - 创建统一的日志函数:`Write-Info`(信息)、`Write-Success`(成功)、`Write-Warning`(警告)、`Write-Error`(错误) + - 所有日志输出都使用统一的格式和颜色,提升可读性 + 5. **错误处理改进**: + - `Invoke-DotnetCommand` 函数统一处理 dotnet 命令执行和错误检查 + - 支持 `ContinueOnError` 参数,允许某些命令失败时继续执行 + - 所有关键步骤都有错误检查和适当的错误提示 + 6. **路径查找优化**: + - `Get-SkiaSharpSourcePath` 函数支持多个可能的 NuGet 包路径 + - 优先查找用户 NuGet 包目录(`$env:USERPROFILE\.nuget\packages`) + - 其次查找 `NUGET_PACKAGES` 环境变量路径 + - 最后查找本地 `packages` 目录 + - 如果找不到,显示期望的完整路径,便于排查问题 + 7. **代码结构优化**: + - 使用 `#region` 和 `#endregion` 标记代码块,便于折叠和导航 + - 分为配置参数区、辅助函数区、主流程区 + - 主流程函数 `Main` 清晰展示脚本执行步骤 + 8. **异常处理**: + - 使用 try-catch 块捕获所有异常 + - 显示详细的错误信息和堆栈跟踪 + - 确保脚本异常退出时也有适当的提示 +- **涉及文件**: + - `AuroraDesk/publish-linux.ps1` - 完全重构,提升代码质量和可维护性 +- **技术要点**: + - 遵循 PowerShell 最佳实践和命名约定(函数使用动词-名词格式,如 `Get-SkiaSharpVersion`) + - 使用哈希表管理配置,避免硬编码 + - 函数职责单一,便于测试和维护 + - 统一的错误处理和日志输出,提升用户体验 + - 自动从项目文件读取版本号,避免版本不匹配问题 +- **效果**: + - ✅ 代码结构清晰,易于理解和维护 + - ✅ 配置参数化,便于修改和扩展 + - ✅ 版本号自动读取,避免硬编码版本不匹配 + - ✅ 统一的日志输出,提升可读性 + - ✅ 完善的错误处理,提升脚本健壮性 + - ✅ 路径查找支持多位置,提高兼容性 + ### 修复 publish-linux.bat 脚本中 SkiaSharp 版本号不匹配和强制复制问题 - **日期**: 2025年1月 - **问题描述**: