8

我们正在使用 Sql Server 2012 SSDT,它删除了 Visual Studio 中数据库项目(现在是 sql 项目)的部署选项。我们希望像部署一样自动化发布步骤,但不清楚如何执行此操作。所以有几个问题:

  1. 我已将 .publish.xml 添加到项目中(在第一次手动发布后,检查添加到项目)。即使在那之后,并将其设置为默认值,当我双击它时,它会构建,但总是会弹出设置窗口,我需要单击“发布”按钮才能继续。是否有可以跳过此提示并使用当前值的设置?

  2. 似乎每次发布都会生成一个版本的 sql 输出。我怎样才能抑制这个 - 即每次都覆盖基本文件?

  3. 最后,任何更新构建以使用新项目类型和自动构建发布命令的指针将不胜感激。

4

3 回答 3

7

如何恢复 Deploy 选项:( 仅限 Visual Studio 2010/2012 -- Visual Studio 2013 不再支持此功能)

部署选项仍然存在,但由于某种原因,它在菜单中不可用。(被诅咒的 Visual Studio 团队!)我通过将部署选项添加到工具栏之一来解决此问题,如下所示:

  1. 单击工具栏右侧的箭头。
  2. 单击“添加或删除按钮”,然后单击自定义。
  3. 在自定义对话框中单击添加命令。
  4. 选择“构建”类别,然后选择“部署选择”命令。
  5. 保存您的选择后,“部署 [项目名称]”选项将出现在工具栏上。您需要在解决方案资源管理器中选择您的项目才能启用该按钮。

请注意,部署设置与发布设置不同。部署设置在“调试”选项卡上的项目属性中进行配置。


要回答有关“发布”选项的问题:

1)如何默认使用特定的发布文件,避免烦人的提示

我不认为有办法解决这个问题。

2)如何发布整个数据库,而不仅仅是更改

在文本编辑器中打开 .publish.xml 文件并添加<AlwaysCreateNewDatabase>true</AlwaysCreateNewDatabase>.

例如:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <TargetDatabaseName>MyDatabase</TargetDatabaseName>
    <DeployScriptFileName>MyDatabaseProject.sql</DeployScriptFileName>
    <TargetConnectionString>Data Source=localhost\SQL2012;Integrated Security=True;Pooling=False</TargetConnectionString>
    <PublishDependentProjects>False</PublishDependentProjects>
    <ProfileVersionNumber>1</ProfileVersionNumber>
    <AlwaysCreateNewDatabase>true</AlwaysCreateNewDatabase>
  </PropertyGroup>
</Project>

3) 自动化构建的命令行语法

首先像往常一样使用 msbuild 构建项目,以便在 bin 中创建 .dacpac 文件。

然后使用sqlpackage.exe您的 .publish.xml 文件进行发布:

C:\Program Files\Microsoft Visual Studio 10.0\Microsoft SQL Server Data Tools\sqlpackage.exe /Action:Publish /SourceFile:C:\[path to my project]\bin\Debug\MyDatabaseProject.dacpac /Profile:C:\[path to my project]\MyDatabaseProject.publish.xml

请注意,sqlpackage.exe 的路径可能不同。

于 2012-04-18T18:10:41.283 回答
4

我承认,聚会有点晚了,但也许这会帮助其他偶然发现这个讨论的人。我的公司目前正在转向 VS2012,我们遇到了与 Keith 相同的三个问题。我找到了#1 和#2 的解决方法。

对于#1,我使用AutoHotKey来监视发布窗口的存在,并自动单击“创建脚本”按钮。您当然可以让脚本自动单击“发布”按钮。在此示例中,如果发布配置文件不是“XYZ”(我总是更喜欢手动干预生产服务器部署),则继续发送 Alt+G 以生成脚本。

#Persistent
SetTimer, ClosePopups, 5000

return

ClosePopups:
if WinExist("Publish Database ")
{
    WinActivate, Publish Database
    WinGetTitle, TitleText, A
    If not TitleText = "Publish Database XYZ.publish.xml" {
        Send, !G
    }
}
return 

对于#2,每次我们发布它时,文件名都会增加一个数字后缀,最终我们的部署文件夹中有很多文件。我只是在构建之前使用预构建事件来清除 .sql 和 .txt 文件:

if exist "$(ProjectDir)$(OutputPath)*.publish.sql" del $(ProjectDir)$(OutputPath)*.publish.sql
if exist "$(ProjectDir)$(OutputPath)*.txt" del $(ProjectDir)$(OutputPath)*.txt
于 2013-05-12T14:47:49.590 回答
4

我发现自动化 SSDT 数据库项目部署的最佳方法是使用 msbuild。最初我们使用 VSTSDB 并针对 *.dbproj 文件使用 msbuild。事实证明,部署 sqlproj 文件的参数完全相同。

因为旧的参数列表对我们有用,所以我没有改用 public.xml 文件样式。针对 dbproj 的 vsdbcmd.exe 和 msbuild 有相当多的文档。我会用它作为参考。

这是我们为 FinalBuilder 执行定义的参数列表和执行输出

[ MSBuild Project [ C:\xx\xxx\xx\xx\MyProject.sqlproj ] ]
  Configuration : Release
  OutDir : C:\Builds\1\xxxxx\builddefname\Binaries\Release\
  DeployToDatabase : True
  TargetDatabase : ExistingDatabaseName
  TargetConnectionString : Data source=.;Integrated Security=SSPI;**
  Build started 3/23/2012 2:17:08 PM.
  Deployment script generated to:
  C:\Builds\1\xxxx\builddefname_FB\Binaries\Release\MyProject.sql
  Dropping FK_at_lusys_assetCategory_at_lusys_image...
  Creating FK_dcb28374eeabe8e715038984419...
  Creating FK_d82897e4acd966d4b136c242cef...
  Checking existing data against newly created constraints
  Update complete.
  Done Building Project "C:\xxx\xxxxxxx\xxxxxxxxx\MyProject.sqlproj" (Deploy target(s)).
  Build succeeded.
  0 Warning(s)
  0 Error(s)

并将 msbuild 命令行放在一起如下所示:

msbuild XXX.sqlproj /target:Deploy /p:Configuration=xxx;OutDir=xxx;DeployToDatabase=True;TargetDatabase=xxxx;TargetConnectionString="xxxxx";AlwaysCreateNewDatabase=True
于 2012-04-06T16:09:22.973 回答