我目前正在使用Microsoft Web部署技术(msbuild和msdeploy命令)将网站部署到服务器。该网站需要部署一个数据库,并且两者都将位于同一服务器中。我正在寻找部署数据库项目的最佳解决方案(使用命令行),我想更好地了解数据库部署的所有技术。
解决方案的内容(Visual Studio 2013):
- 数据库项目(适用于SQL Server 2008)
- 类库(具有NHibernate的数据访问层)
- web项目(ASP.NET MVC4)
注意:我不是自愿在VS中使用持续集成/交付工具或发布方法。我在这个项目中的第一个目标是了解msbuild/mdeploy是如何工作的。。。
我看了一下vsdbcmd命令,它似乎完成了我想要的所有步骤。。。除了我需要将Visual Studio DLL/文件导入我的远程服务器,我想知道是否没有更好的方法。。。我还查看了msdeploy提供程序dbSqlPackage/dbDacFx,但据我所知,它使用dacpac来应用架构更改。类似地,SqlPackage.exe似乎也使用了dacpac。
使用dacpac听起来是个好主意,但我对以下问题感到困惑:
- 这是否意味着我第一次创建数据库时需要一个不同的过程?如果是,哪个命令会是最好的
- 有可能从我的sqlproj文件创建一个dacpac吗?如果是,怎么做
从命令行以及您的经验和项目来看,还有其他部署方式吗?部署此类项目的最佳方式是什么?
非常感谢,
经过进一步的研究,我发现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在(bin/Release)时,msbuild创建的zip文件的路径
数据库构建:
msbuild %fullpathsqlproj% /P:Configuration=Release
数据库部署:
msdeploy -verb:Sync -Source:dbDacFx=%fullpathdacpac% -Dest:dbDacFx=%connectionstring%
这个解决方案目前让我很满意。尽管如此,我仍然愿意听取意见和改进建议。
好的,所以.sqlproj文件被编译成dacpac文件,该文件基本上是一个包含任何部署前/部署后文件的zip文件和一个包含所有sql脚本(模型)内容的xml文件。
当您使用msbuild时,它会使用DacFx api来比较dacpac中的更改并将其发布到sql数据库。
你可以使用msbuild,也可以自己使用DacFx api,或者通常人们使用sqlpackage.exe获取dacpac并与数据库进行比较,然后它可以生成一个脚本,这样你就可以手动运行它,也可以运行它生成的脚本来更新数据库。
您可以使用sqlpackage做其他事情,例如生成一个部署报告,其中包含如果要求它更改的所有内容。
你通过构建你的项目生成一个dacpac,它将在你的输出目录中。
它是幂等的,这意味着无论它运行多少次,在第一个实例之后,它总是会得到相同的结果——所以每次你更改代码、构建dacpac并部署它——如果数据库不存在,那么它就会被创建,如果它确实存在,它只会部署更改。