VS中SQL Server数据库项目如何让SQL脚本生成在ILMerge合并后执行
SQL Server数据库项目ILMerge合并后生成dacpac的构建流程调整方案
我在Visual Studio的解决方案内有一个SQL Server数据库项目及多个依赖项目,编译该数据库项目时默认会输出SQL脚本与.dacpac文件。我的需求是通过ILMerge.MSBuild.Tasks.ILMerge将所有依赖项目的dll合并为单个dll后,再基于合并后的dll生成对应的SQL脚本和.dacpac文件。
最初我将ILMerge逻辑配置在sqlproj文件的AfterBuild事件中,但合并操作执行时机晚于SQL脚本生成步骤,无法达到需求。
初始构建日志
2>------ Rebuild All started: Project: TestCLR, Configuration: Debug Any CPU ------ 2> D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn\csc.exe /noconfig /nowarn:1701,1702,2008 /fullpaths /nostdlib+ /errorreport:prompt /warn:4 /define:DEBUG;TRACE /errorendlocation /preferreduilang:en-US /highentropyva+ /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\mscorlib.dll" /reference:D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestLogic.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Data.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.dll" /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Xml.dll" /debug+ /debug:full /optimize- /out:obj\Debug\TestCLR.dll /subsystemversion:6.00 /target:library /warnaserror- /utf8output /langversion:7.3 TestProcedures.cs 2> Loading project references... 2> Loading project files... 2> Building the project model and resolving object interdependencies... 2> Validating the project model... 2> Writing model to D:\Work\FF\Sql-Objects\Tools\TestCLR\obj\Debug\Model.xml... 2> Writing create script to TestCLR_Create.sql... 2> TestCLR -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dll 2> TestCLR -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dacpac 2> ILMerge bin\Debug\TestCLR.dll;bin\Debug\TestLogic.dll;bin\Debug\Sider.dll -> D:\Work\FF\Sql-Objects\Tools\TestCLR\bin\Debug\TestCLR.dll ========== Rebuild All: 2 succeeded, 0 failed, 0 skipped ==========
初始ILMerge配置(位于sqlproj的</Project>标签前)
<UsingTask TaskName="ILMerge.MSBuild.Tasks.ILMerge" AssemblyFile="$(SolutionDir)\packages\ILMerge.MSBuild.Tasks.1.0.0.3\tools\ILMerge.MSBuild.Tasks.dll" /> <Target Name="AfterBuild"> <ItemGroup> <MergeAsm Include="bin\Debug\*.dll" /> </ItemGroup> <PropertyGroup> <MergedAssembly>$(ProjectDir)$(OutDir)RedisCLR.dll</MergedAssembly> </PropertyGroup> <Message Text="ILMerge @(MergeAsm) -> $(MergedAssembly)" Importance="high" /> <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" /> </Target>
第一次调整遇到的问题
我尝试修改构建依赖顺序,让ILMerge在SQL生成步骤前执行,配置如下:
<PropertyGroup> <SqlBuildDependsOn> BeforeSqlBuild; $(SqlBuildDependsOn); </SqlBuildDependsOn> </PropertyGroup> <Target Name="BeforeSqlBuild"> <!-- ILMerge逻辑 --> </Target>
该方案触发了新问题:依赖项目的dll会在构建流程接近PostBuildEvent的阶段才输出到Bin\debug目录,提前执行ILMerge会报错找不到待合并的dll。
最终解决方案
调整ILMerge的dll收集路径,不从输出的bin目录取文件,改为从obj文件夹和依赖项目的构建输出路径直接收集待合并的dll,即可解决路径找不到的问题,同时满足「先合并dll,再生成SQL脚本和dacpac」的需求。
内容的提问来源于stack exchange,提问作者Viktor Bardakov
相关产品推荐
相关产品推荐

