2

我目前正在使用 Microsoft Web 部署技术(msbuild 和 msdeploy 命令)将网站部署到服务器。该网站需要部署一个数据库,并且两者都将在同一台服务器中。我正在寻找部署数据库项目(使用命令行)的最佳解决方案,并且我想更好地了解围绕数据库部署的所有技术。

解决方案的内容(Visual Studio 2013):

  • 一个数据库项目(用于 SQL Server 2008),
  • 一个类库(NHibernate 的数据访问层)
  • 一个网络项目(ASP.NET MVC4)。

注意:我不是自愿在 VS 中使用持续集成/交付工具或发布方法。我对这个项目的第一个目标是了解 msbuild / msdeploy 是如何工作的......

我看了一下vsdbcmd命令,它似乎可以完成我想要的所有步骤......除了我需要将 Visual Studio DLL/文件导入我的远程服务器,我想知道是否没有更好的方法......我也看了在 msdeploy 提供者dbSqlPackage /dbDacFx 处,但据我了解,它使用 dacpac 来应用架构更改。同样,SqlPackage.exe 似乎也使用了 dacpac。

使用 dacpac 听起来不错,但我对以下问题感到困惑:

  • 这是否意味着我在第一次创建数据库时需要一个不同的过程?如果是,哪个命令最好?
  • 是否可以从我的 sqlproj 文件创建 dacpac?如果是,该怎么做?

从命令行以及您的经验和项目中是否有其他部署方式,部署此类项目的最佳方式是什么?

非常感谢,

4

2 回答 2

9

通过进一步研究,我发现 Visual Studio 在构建 sqlproj(bin/Debug 或 bin/Release,具体取决于您的构建配置)时正在创建一个 dacpac。第一次部署时,dacpac 会创建您的数据库。当您进行架构更改时,它似乎会应用它们。

这里总结了网站和数据库的命令行:

网站建设

msbuild %fullpathwebcsproj% /P:Configuration=Release /T:Package

网站部署(默认应用程序池)

msdeploy -verb:sync -source:package=%fullpathpackage% -dest:auto

%fullpathpackage%:当 /T:Package 存在时 msbuild 创建的 zip 文件的路径(bin/Release)

数据库构建:

msbuild %fullpathsqlproj% /P:Configuration=Release 

数据库部署:

msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%

这个解决方案现在让我很满意。尽管如此,我仍然愿意接受改进的意见和建议。

于 2015-04-10T18:57:30.237 回答
1

好的,一个 .sqlproj 文件被编译成一个 dacpac 文件,该文件基本上是一个 zip 文件,其中包含任何部署前/后的文件和一个包含所有 sql 脚本(模型)内容的 xml 文件。

当您使用 msbuild 时,它使用 DacFx api 比较 dacpac 中的更改并将其发布到 sql 数据库。

您可以使用 msbuild 或者您可以自己使用 DacFx api,或者通常人们使用 sqlpackage.exe 来获取 dacpac 并与数据库进行比较,然后它可以生成脚本以便您可以手动运行它,也可以运行它生成的脚本更新数据库。

您可以使用 sqlpackage 执行其他操作,例如生成一个部署报告,其中包含如果被要求会更改的所有内容。

您通过构建项目生成 dacpac,它将位于您的输出目录中。

它是幂等的,这意味着无论它运行多少次,在第一个实例之后它总是以相同的结果结束 - 所以每次你更改代码时,构建 dacpac 并部署它 - 如果数据库不存在,那么它将被创建,如果它确实存在,它将只部署更改。

于 2015-04-27T15:30:24.683 回答