为Visual Studio 2017无头安装SQL Server数据工具(SSDT)

时间:2017-10-23 22:06:19

标签: visual-studio-2017 sql-server-data-tools

对于构建服务器,我们需要为Visual Studio 2017无头安装SQL Server数据工具。

我们的构建服务器已经拥有了#34; Visual Studio 2017的构建工具",它为无头构建提供了很好的支持。但是由于缺少MSBuild目标,任何具有SSDT项目的解决方案都会失败,例如:

[MSBuild] src\Database\Upfront.Database.sqlproj: Build default targets [10:27:46][src\Database\Upfront.Database.sqlproj] E:\BuildAgent\work\7769fbf76d8b9008\src\Database\Upfront.Database.sqlproj(56, 3): error MSB4019: The imported project "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\Microsoft\VisualStudio\v15.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.

首先,我尝试修改由&#34; Visual Studio 2017和#34;构建工具安装的组件集,但似乎没有可用的SSDT组件。

其次,我尝试安装SSDT for Visual Studio 2017,这似乎无法正确安装到&#34;构建工具for VS 2017&#34;轮廓。它允许我创建一个新的VS 2017配置文件,例如SQL,因此所需的MSBuild文件安装在C:\Program Files (x86)\Microsoft Visual Studio\2017\SQL\下;但它会改变我的msbuild环境变量,以便&#34;构建VS 2017的工具&#34;找不到C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools中的文件,导致C#项目无法构建。

似乎&#34; SSDT for Visual Studio 2017&#34;和#34;为Visual Studio 2017构建工具&#34;并不相互兼容。有没有人能够让他们一起工作?或者有没有人找到在构建服务器上构建SSDT项目的更好方法?

SSDT非常棒,除了构建服务器支持,每次都很痛苦。

3 个答案:

答案 0 :(得分:4)

对ssdt数据库项目的构建支持现在可用作此确切方案的nuget包。

这包含有关如何为ssdt数据库项目配置构建服务器的所有详细信息:

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

它的要点是你下载nuget包并将其解压缩到某处,然后设置几个环境变量来指向包内容,你应该没有视觉工作室继续构建。

答案 1 :(得分:0)

我能够通过删除Visual Studio 2017的构建工具(或者从一开始就避免使用它)并使用SQL Server数据工具安装完整的Visual Studio来实现这一目的。

然后,只需从构建服务器中的完整安装中引用MSBuild。

使用TeamCity这涉及重新启动构建代理,之后他们引用了正确的完整VS路径到MSBuild。

答案 2 :(得分:0)

在服务器上安装适用于Visual Studio 2017的SSDT后,需要将名为SQLDBExtensionsRefPath的环境变量设置为&#34; C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ SQL \的MSBuild \微软\ VisualStudio的\ V15.0 \ SSDT&#34 ;.此环境变量由.sqlproj文件中的以下行使用:

<Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
<Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />

现在msbuild将能够找到.targets文件,但它仍然会在BuildTools文件夹而不是SQL文件夹中查找IDE扩展。我认为设置SSDTPath环境变量应该解决这个问题(您可以尝试将其设置为&#34; C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ SQL \ Common7 \ IDE \ Extensions \ Microsoft \ SQLDB \ Dac \ 140&#34;并查看您的构建是否有效),但我仍然遇到错误,因为msbuild无法找到master.dacpac文件。

最后,我修改了.sqlproj文件以修复SSDTExists属性并修改VsInstallRoot属性。我改变了以下几行:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
  <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
  <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
  <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
</PropertyGroup>

为:

<PropertyGroup>
  <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
  <!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
  <SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets') Or '$(SQLDBExtensionsRefPath)' != ''">True</SSDTExists>
  <VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
</PropertyGroup>
<PropertyGroup>
  <!-- In the case that SSDT was installed separately from Visual Studio (e.g. for the Visual Studio build tools), change the VsInstallRoot so that the IDE extension will be found. -->
  <VsInstallRoot Condition="!Exists('$(VsInstallRoot)\Common7\IDE\Extensions\Microsoft\SQLDB') And Exists('$(VsInstallRoot)\..\SQL')">$(VsInstallRoot)\..\SQL</VsInstallRoot>
</PropertyGroup>

我没有遇到过SSDT安装导致msbuild环境变量混乱的问题,因此只需进行这两项更改,我的构建服务器上的所有内容都能顺利运行。