簡體   English   中英

VS 中的 SQL Server 數據庫項目。 構建過程中 sql 腳本生成步驟的順序

[英]SQL Server database project in VS. Order of sql script generation step in build process

我的解決方案中有一個 SQL Sever 數據庫項目和幾個依賴項項目。

當我編譯(在 VS 中)這個數據庫項目時,我得到了一個 SQL 腳本和一個.dacpac文件。

但我也想將我所有的依賴項項目聚合到一個 dll 中,並僅為這個結果 dll 制作 SQL 腳本.dacpac文件。

我正在使用 ILMerge.MSBuild.Tasks.ILMerge 在 sqlproj 中的 AfterBuild 事件上聚合所有 dll。 但是這種聚合發生在生成 SQL 腳本之后。

最后如何強制生成 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 ==========

.sqlproj 部分與 ILMerge(現在它在最后一個位置。就在 /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) -&gt; $(MergedAssembly)" Importance="high" />
    <ILMerge InputAssemblies="@(MergeAsm)" OutputFile="$(MergedAssembly)" TargetKind="SameAsPrimaryAssembly" />
  </Target>

非常感謝所羅門·魯茨基先生。 這個解決方案很有幫助。

<PropertyGroup>
  <SqlBuildDependsOn>
    BeforeSqlBuild;
    $(SqlBuildDependsOn);
  </SqlBuildDependsOn>
</PropertyGroup>
<Target Name="BeforeSqlBuild">
  ILMerge things
</Target>

但是有一件奇怪的事情。 Dll 在流程結束時來到 Bin\\debug (我認為在 PostBuildEvent 步驟或附近)。 如果我將 ILMerge 移到流程的上層 - 它會返回錯誤,即沒有 DLL。 將 obj 文件夾和依賴項目中的配置更改為 gater dll。

有趣的問題。 我不知道有什么簡單的方法可以做到這一點,或者一開始是否有可能。 但是,我知道有兩個選項可以改變構建過程:

選項1

注入構建步驟/目標。 SSDT 至少缺少兩個構建步驟/目標——“BeforeSqlBuild”和“BeforePublish”——因為“AfterBuild”目標在這個過程中為時已晚(如您所見)。

為了解決 SQL Server 2017 中引入的“CLR 嚴格安全性”問題(記錄在我的以下帖子中: SQLCLR 與 SQL Server 2017,第 3 部分:“CLR 嚴格安全性”——解決方案 2 ),我更新了.sqlproj文件通過將以下內容放在最后,就在結束</Project>標記之前(用證書簽署程序集):

<PropertyGroup>
  <SqlBuildDependsOn>
    BeforeSqlBuild;
    $(SqlBuildDependsOn);
  </SqlBuildDependsOn>
</PropertyGroup>
<Target Name="BeforeSqlBuild">
  <Exec Command="{DOS / Windows commands}"/>
</Target>

您可以保留<Exec Command="..."/>和/或添加現有“AfterBuild”目標的內容。 但是,即使在正確的時間執行操作,我也不能完全確定您是否能夠更改它想要序列化並放入“創建”腳本的程序集名稱(即從使用“TestCLR .dll”到“RedisCLR.dll”)。 您可以嘗試重新分配構建變量,但我從未嘗試過並且不確定是否允許。 在這種情況下,下一個選項可能會有所幫助。

(請投票支持我的改進請求以改進 SSDT 構建過程:
將“BeforeSqlBuild”和“BeforePublish”的 MSBuild 預定義目標添加到 SSDT SQL Server 數據庫項目

選項 2

使用 .NET 創建可以訪問對象、文件和整個過程的自定義構建任務:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM