代码之家  ›  专栏  ›  技术社区  ›  Brandon Avant

在Ubuntu中构建SQL Server数据库项目

  •  20
  • Brandon Avant  · 技术社区  · 7 年前

    我正在构建一个ASP。NET Core 2.0 Web API应用程序,托管在Ubuntu环境中。到目前为止,我已经在Ubuntu中成功地构建和运行了一些东西(针对.NET核心应用程序)。

    对于数据库,我的解决方案中包含了一个SqlProj。该项目包括典型的内容,如表、SP和部署前/部署后脚本。我正在使用以下命令(在基于Windows的开发人员计算机上)构建和部署此项目:

    msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"
    

    当我采用这种方法时,一切都会正确构建和部署;然而,由于我将利用。NET Core CLI命令+针对Ubuntu环境的CI/CD,我想做一些更像:

    dotnet msbuild .\MyProject.DB.sqlproj /t:Build /t:Publish /P:SqlPublishProfilePath="./PublishProfiles/MyProject.DB.publish.xml"
    

    在Windows中,我立即得到错误:

    error MSB4019: The imported project "C:\Program Files\dotnet\sdk\2.1.4\Microsoft\VisualStudio\v11.0\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
    

    基本上,我要问的是如何在Ubuntu环境中成功构建和部署SqlProj项目。我尝试过谷歌搜索,但到目前为止,我一点运气都没有。我发现的所有类似问题都是针对那些正在编辑其。proj文件以其VS文件夹的SSDT为目标。所有这些人都在Windows中修复该问题。这种方法在Ubuntu中不起作用,因为目标文件使用Windows注册表项。

    EDIT:我知道为了使用MSBuild执行这样的部署,需要SSDT。我没有发现任何证据表明在Ubuntu中安装/使用SSDT是可行的。如果不是,也许还有其他解决方案?

    仅供参考,我知道使用EF Core的代码优先方法是可能的。我尝试采用原始SP方法(以及利用索引),并使用SqlProj跟踪我的所有代码。这些都将从Git回购中存储和CI/CDed。

    6 回复  |  直到 7 年前
        1
  •  6
  •   nschonni    7 年前

    您可以使用此NuGet包进行部署,而无需安装SSDT https://www.nuget.org/packages/Microsoft.Data.Tools.Msbuild 我不知道它是在Ubuntu上运行还是与dotnet cli集成

        2
  •  3
  •   Brandon Avant    5 年前

    我的2020解决方案

    我想在2020年重新讨论这个问题,并对我最初的问题给出最新的答案。

    我采用了不同的方法来构建部署SQL Server项目的。我目前的方法是构建一个使用vs2017-win2016代理的管道,并使用它来构建。dacpac。从那里,您构建了一个部署管道,以将dacpac(从您的工件删除)部署到SQL Server实例。

    这种方法更好地适应了DevOps方法,并删除了与我以前的解决方案相关的手动过程。

    您可以在此处阅读更多信息:

    https://docs.microsoft.com/en-us/azure/devops/pipelines/apps/aspnet/build-aspnet-dacpac?view=azure-devops

        3
  •  2
  •   Ryan    7 年前

    我不知道这是否能在Ubuntu上运行,但我们最近在一台没有安装SSDT的Windows构建机器上,使用了上面提到的NuGet包,完成了这项工作。突破之处在于将以下文章中的细节拼凑在一起,特别是将SDK与MSBuild结合使用需要设置环境变量才能工作。

    https://blogs.msdn.microsoft.com/ssdt/2016/08/22/part-5-use-your-own-build-and-deployment-agent/

    有了这些添加的信息,我们在解决方案文件夹的根目录中安装了NuGet包,然后在PowerShell中编写了一个构建脚本。该脚本首先设置环境变量,然后使用适当的输出目录对SqlProj文件调用MSBuild。我们并没有在那个时候专门发布,而是将工件发布到我们的工作流中的Octopus Deploy,该工作流执行实际的部署。

    同样,我不确定这对Ubuntu是否有帮助,但我认为额外的细节可能有用。

        4
  •  2
  •   Xzemora    4 年前

    另一种方法是,可以使用dotnet cli和sqlpackage实现这一点,如前所述 here 使用MSBuild Sdk。

    您基本上有一个数据库项目。让我们称之为“DatabaseProject”。

    您创建的新项目是。NET标准c#库,您可以将其称为“DatabaseProject.Build”。

    然后可以配置DatabaseProject。建筑csproj本身:

    <Project Sdk="MSBuild.Sdk.SqlProj/1.11.4">
       <PropertyGroup>
           <TargetFramework>netstandard2.0</TargetFramework>
           <Configurations>Debug;Release</Configurations>
       </PropertyGroup>
       <ItemGroup>
           <Content Include="..\DatabaseProject\**\*.sql" />
           <Content Remove="..\DatabaseProject\bin\*.sql" />
           <Content Remove="..\DatabaseProject\**\*.PostDeployment.sql" />
           <PostDeploy Include="..\DatabaseProject\**\*.PostDeployment.sql" />
       </ItemGroup>
    </Project>
    

    请注意 使用的版本 V1.11.4 是支持电流的。在编辑本文时,visual studio附带了NET SDK。退房 the github repo 获取项目的最新nuget版本。

    使用dotnet build将生成一个dacpac,您可以将其用于dotnet publish或 sqlpackage .

    然后可以发布到SqlServer实例。 如果您像我一样在CI中使用linux runner,您可能需要SqlServer身份验证方法,然后运行

    sqlpackage /Action:Publish \    
    /SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\" \
    /TargetServerName:MyDatabaseServerName \
    /TargetDatabaseName:MyDatabaseName \
    /TargetUser:Username\
    /TargetPassword:Password
    

    或者使用visual studio生成的配置文件:

    sqlpackage /Action:Publish /Profile:\"DatabaseProject/PublishProfile/MyProfile.publish.xml\" /SourceFile:\"DatabaseProject.Build/bin/Debug/netstandard2.0/DatabaseProject.Build.dacpac\"
    

    dotnet publish /p:TargetServerName=MyServerName /p:TargetDatabaseName=MyDatabseName /p:TargetUser=<username> /p:TargetPassword=<password>
    
        5
  •  2
  •   GameSalutes    3 年前

    Azure Data Studio现在有一个扩展,允许您使用dotnet工具构建数据库项目(sqlproj)。构建项目背后的智慧在于SQL Server Tools包,该扩展从中获取所需的“BuildDirectory”DLL并以依赖关系为目标。

    虽然没有文档记录,但如果您想在Azure Data Studio之外完全无头地进行设置,可以遵循他们的CLI指南, https://docs.microsoft.com/en-us/sql/azure-data-studio/extensions/sql-database-project-extension-build-from-command-line?view=sql-server-ver15 ,而是从中的RHEL版本中提取必要的文件 https://github.com/microsoft/sqltoolsservice/releases 然后按照扩展的其余文档进行操作。下面是一个工作Dockerfile,演示了该方法:

    FROM mcr.microsoft.com/dotnet/sdk:6.0
    
    WORKDIR /app
    
    RUN apt-get update \
        && apt-get install -y curl
    
    # SSDT dlls and targets file used by Azure Data Studio Extension can be found in the SQL Tools Service project
    RUN curl -sSL -o /tmp/sqltools.tar.gz https://github.com/microsoft/sqltoolsservice/releases/download/v3.0.0-release.181/Microsoft.SqlTools.ServiceLayer-rhel-x64-net6.0.tar.gz
    
    # Extract files that are required per https://docs.microsoft.com/en-us/sql/azure-data-studio/extensions/sql-database-project-extension-build-from-command-line?view=sql-server-ver15
    
    RUN mkdir /tmp/sqltools && tar -xzf /tmp/sqltools.tar.gz -C /tmp/sqltools && \
      mkdir /app/BuildDirectory && cd /tmp/sqltools && cp \
        Microsoft.Data.SqlClient.dll \
        Microsoft.Data.Tools.Schema.Sql.dll \
        Microsoft.Data.Tools.Schema.SqlTasks.targets \
        Microsoft.Data.Tools.Schema.Tasks.Sql.dll \
        Microsoft.Data.Tools.Utilities.dll \
        Microsoft.SqlServer.Dac.dll \
        Microsoft.SqlServer.Dac.Extensions.dll \
        Microsoft.SqlServer.TransactSql.ScriptDom.dll \
        Microsoft.SqlServer.Types.dll \
        System.ComponentModel.Composition.dll \
        System.IO.Packaging.dll \
      /app/BuildDirectory && \
      rm -r /tmp/sqltools
    
    #dotnet build your-database-project.sqlproj /p:NetCoreBuild=true /p:NETCoreTargetsPath="/app/BuildDirectory"
    

    最后的注释命令显示了可以在包含数据库项目的目录中的容器内运行的内容。

    然后,还可以将其与利用sqlpackage的容器相结合,以实现完整的dacpac构建和发布自动化工具集。

        6
  •  1
  •   Roozbeh    3 年前

    如上所述,在linux代理上构建DacPac文件的最简单方法是通过 MSBuild.Sdk.SqlProj 并行转到数据库项目目录。sqlproj文件创建如下目录 DB.Build 在它下面创建 DB.Build.csproj 复制请按以下方式传送内容

    <Project Sdk="MSBuild.Sdk.SqlProj/1.1.0"> <!-- This will pull in the required tools and dependencies to build a .dacpac with .NET Core -->
        <PropertyGroup>
            <TargetFramework>netstandard2.0</TargetFramework>
        </PropertyGroup>
        <ItemGroup>
            <Content Include="..\src\DB\masterdata\**\*.sql" /> <!-- link in the new .csproj to the .sql scripts in your existing database project -->
        </ItemGroup>
    </Project>
    

    运行后,您将看到dacpac文件出现在 DB.Build/bin/Release/netstandard2.0/DB.Build.dacpac

    这是我的构建代理输出(Azure devops上的Ubuntu代理)

    Starting: SQL DB build Release
    ==============================================================================
    Task         : .NET Core
    Description  : Build, test, package, or publish a dotnet application, or run a custom dotnet command
    Version      : 2.187.0
    Author       : Microsoft Corporation
    Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/dotnet-core-cli
    ==============================================================================
    Info: .NET Core SDK/runtime 2.2 and 3.0 are now End of Life(EOL) and have been removed from all hosted agents. If you're using these SDK/runtimes on hosted agents, kindly upgrade to newer versions which are not EOL, or else use UseDotNet task to install the required version.
    /opt/hostedtoolcache/dotnet/dotnet build /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj -dl:CentralLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll"*ForwardingLogger,"/home/vsts/work/_tasks/DotNetCoreCLI_5541a522-603c-47ad-91fc-a4b1d163081b/2.187.0/dotnet-build-helpers/Microsoft.TeamFoundation.DistributedTask.MSBuild.Logger.dll" --configuration Release /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation=/home/vsts/work/1/recommender-service-cicd/DacPac/
    Microsoft (R) Build Engine version 16.5.0+d4cbfca49 for .NET Core
    Copyright (C) Microsoft Corporation. All rights reserved.
    
      Restore completed in 51.72 ms for /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/RecommenderAPI.DB.Build.csproj.
      Using package name RecommenderAPI.DB.Build and version 1.0.0
      Using SQL Server version Sql150
      Deleting existing file /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
      Writing model to /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/obj/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
      RecommenderAPI.DB.Build -> /home/vsts/work/1/s/src/RecommenderAPI.DB/RecommenderAPI.DB/RecommenderAPI.DB.Build/bin/Release/netstandard2.0/RecommenderAPI.DB.Build.dacpac
    
    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time Elapsed 00:00:01.71
    
    Finishing: SQL DB build Release
    
    

    注意:请确保在生成之前在步骤中还原NuGet包