【问题标题】:SQL Server database project in VS. Order of sql script generation step in build processVS 中的 SQL Server 数据库项目。构建过程中 sql 脚本生成步骤的顺序
【发布时间】:2021-09-06 07:30:37
【问题描述】:

我的解决方案中有一个 SQL Server 数据库项目和几个依赖项项目。

当我编译(在 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>

非常感谢 Solomon Rutzky 先生。这个解决方案很有帮助。

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

但是有一件奇怪的事情。 Dll 在流程结束时到达 Bin\debug(我认为在 PostBuildEvent 步骤或附近)。如果我将 ILMerge 移到流的上层 - 它会返回错误,即没有 DLL。将 obj 文件夹和依赖项目的配置更改为 gater dll。

【问题讨论】:

    标签: sql-server visual-studio msbuild sql-server-data-tools sqlclr


    【解决方案1】:

    有趣的问题。我不知道有任何简单 方法可以做到这一点,或者一开始是否有可能。但是,我知道有两个选项可以改变构建过程:

    选项 1

    注入构建步骤/目标。 SSDT 至少缺少两个构建步骤/目标——“BeforeSqlBuild”和“BeforePublish”——因为“AfterBuild”目标在过程中太晚了(正如您所发现的那样)。

    为了解决 SQL Server 2017 中引入的“CLR 严格安全”问题(记录在我的以下帖子中:SQLCLR vs. SQL Server 2017, Part 3: “CLR strict security” – Solution 2),我更新了 .sqlproj 文件,将以下内容放在最后,就在结束 &lt;/Project&gt; 标记之前(用证书签署程序集):

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

    您可以保留&lt;Exec Command="..."/&gt; 和/或添加现有“AfterBuild”目标的内容。但是,即使在正确的时间执行该操作,我也不完全确定您是否能够更改它想要序列化并放入“创建”脚本的程序集名称(即从使用“TestCLR .dll”到“RedisCLR.dll”)。您可以尝试重新分配构建变量,但我从未尝试过,并且不确定是否允许。在这种情况下,下一个选项可能会有所帮助。

    (请投票支持我的改进请求以改进 SSDT 构建过程:
    Add MSBuild predefined Targets for "BeforeSqlBuild" and "BeforePublish" to SSDT SQL Server Database Projects

    选项 2

    使用 .NET 创建可以访问对象、文件和整个过程的自定义构建任务:

    【讨论】:

    • 非常感谢选项 1!这个对我有用。但是有一件奇怪的事情。 Dll 在流程结束时到达 Bin\debug(我认为在 PostBuildEvent 步骤或附近)。如果我将 ILMerge 移到流的上方 - 它会返回错误,即没有 DLL。将 obj 文件夹和依赖项目的配置更改为 gater dll。
    • @ViktorBardakov 很高兴它成功了!由于 DLL 名称更改,我有点担心。你最终是如何处理那部分的?另外,很抱歉我忘了提到您需要查看 obj 文件夹。我在我的博客文章中记录了这一点,但忽略了它与您从哪里获取 DLL 不同的重要性。
    • 我的错误。当我将“Redis”更改为“Test”时,忘记了 MergedAssembly。事实上,我不会更改 DLL 名称。 ILmerge 的输出(MergedAssembly 属性)与在 sqlproj 中生成的名称相同。但是我将结果 dll 放在 OBJ 文件夹中,所以最终构建可以从那里获取并粘贴到 bin 文件夹中@SolomonRutzky
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2018-05-19
    • 2017-05-24
    相关资源
    最近更新 更多