桌面端打包优化

This commit is contained in:
geht
2026-05-18 17:31:18 +08:00
parent c11f3104cb
commit 2ed796c1a1
8 changed files with 639 additions and 9 deletions

View File

@@ -163,9 +163,11 @@ namespace YY.Admin.Core.SqlSugar
config.ConnectionString = CryptogramUtil.Decrypt(config.ConnectionString);
}
// SQLite 相对路径默认依赖进程工作目录;快捷方式/从不同目录启动会在别处生成空库,表现为发布后菜单全空
// SQLite 相对路径会解析到 LocalApplicationData\Data见 ResolveSqliteConnectionToAbsolutePath
if (config.DbType == DbType.Sqlite && !string.IsNullOrWhiteSpace(config.ConnectionString))
{
// 安装包随带的 Admin.NET.db / Slave.db 在安装目录;运行时代码只读写可写目录。首启若无用户库则从安装目录复制模板。
TrySeedSqliteFromInstallDirectory(config.ConnectionString);
config.ConnectionString = ResolveSqliteConnectionToAbsolutePath(config.ConnectionString);
}
@@ -266,7 +268,41 @@ namespace YY.Admin.Core.SqlSugar
}
/// <summary>
/// 将 SQLite 连接串中的相对 DataSource 解析为基于应用程序基目录的绝对路径
/// 首次启动时:若用户数据目录中尚无该 SQLite 文件且安装目录exe 旁)存在同名库,则复制一份作为初始模板
/// 否则安装包内随带的菜单/配置永远不会被用到(实际始终读写 %LocalAppData%\YY.Admin\Data\)。
/// </summary>
private static void TrySeedSqliteFromInstallDirectory(string connectionString)
{
try
{
var builder = new SqliteConnectionStringBuilder(connectionString);
var ds = builder.DataSource;
if (string.IsNullOrWhiteSpace(ds) || Path.IsPathFullyQualified(ds))
return;
var fileName = Path.GetFileName(ds.TrimStart('.', '/', '\\'));
if (string.IsNullOrWhiteSpace(fileName))
fileName = "Admin.NET.db";
var dataDir = AppWritablePaths.EnsureDirectoryExists(AppWritablePaths.DataDirectory);
var targetPath = Path.Combine(dataDir, fileName);
if (File.Exists(targetPath))
return;
var bundledPath = Path.Combine(AppContext.BaseDirectory, fileName);
if (!File.Exists(bundledPath))
return;
File.Copy(bundledPath, targetPath, overwrite: false);
}
catch
{
// 忽略:后续仍可按空库走建表/基准种子
}
}
/// <summary>
/// 将 SQLite 连接串中的相对 DataSource 解析为 %LocalAppData%\YY.Admin\Data\ 下绝对路径(适配 Program Files 只读安装)。
/// </summary>
private static string ResolveSqliteConnectionToAbsolutePath(string connectionString)
{
@@ -284,7 +320,7 @@ namespace YY.Admin.Core.SqlSugar
return connectionString;
}
// Program Files 等安装目录对普通用户只读SQLite 放到 LocalApplicationData
// Program Files 等安装目录对普通用户只读;运行期 SQLite 放到 LocalApplicationData(首启可由 TrySeedSqliteFromInstallDirectory 从安装目录拷贝模板)
var dataDir = AppWritablePaths.EnsureDirectoryExists(AppWritablePaths.DataDirectory);
var fileName = Path.GetFileName(ds.TrimStart('.', '/', '\\'));
if (string.IsNullOrWhiteSpace(fileName))