FluentMigrator在.NET 8 MAUI iOS AOT编译下的问题及依赖精简需求
解决方案:仅引入SQLite运行器避免AOT编译失败
完全可以只引入所需的SQLite运行器,不需要依赖包含全量运行器的FluentRunner.Runner包,具体操作如下:
移除全量运行器包
先从项目中移除FluentRunner.Runner的NuGet引用,这个包是元包,会自动引入SQLServerCE、Hana等所有数据库的运行器实现,正是这些多余的依赖导致iOS AOT编译失败。添加SQLite相关的最小依赖
只添加以下必要的NuGet包:FluentMigrator:FluentMigrator的核心功能库FluentMigrator.Runner.SQLite:针对SQLite的运行器实现(如果你的项目用的是Microsoft.Data.Sqlite,可以改用FluentMigrator.Runner.SQLite.Microsoft.Data.Sqlite,根据实际SQLite库选择)
配置运行器服务
在代码中配置FluentMigrator时,只注册SQLite相关的服务,示例代码如下:using FluentMigrator.Runner; using Microsoft.Extensions.DependencyInjection; var services = new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb => rb .AddSQLite() // 仅注册SQLite运行器 .WithGlobalConnectionString("你的SQLite连接字符串") .ScanIn(typeof(你的迁移类).Assembly).For.Migrations()) .AddLogging(lb => lb.AddFluentMigratorConsole()); var serviceProvider = services.BuildServiceProvider(); using var scope = serviceProvider.CreateScope(); var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>(); runner.MigrateUp();重新执行发布命令
再次运行发布命令:dotnet publish -c Release -f net8.0-ios project.csproj此时项目不再包含SQLServerCE等多余依赖,AOT编译应该可以正常完成。
原因说明
FluentRunner.Runner作为元包的设计是为了方便快速引入所有数据库支持,但在iOS这类对AOT编译要求严格的平台上,很多非必要的数据库驱动(比如SQLServerCE)本身不支持iOS环境,或者包含无法被AOT编译器处理的代码,从而触发编译错误。通过只引入目标数据库的运行器,就能规避这些不必要的依赖问题。
内容的提问来源于stack exchange,提问作者Bakhshi
相关产品推荐
相关产品推荐

