Вызов VSDBCMD из файла dbproj
У меня есть стандартный проект SQL Server 2008, который был создан с использованием vs2010. Я пытался изменить процесс сборки так, чтобы в конце запускалась пользовательская задача, которая вызывала бы VSDBCMD для генерации сценария развертывания, сравнивая выходные данные сборки (файл dbschema) со статическим файлом DBschema. Когда я запускаю эту команду из командной строки VS2010
vsdbcmd.exe /a:deploy /dd:- /dsp:sql /model:obj\Release\EnterpriseBuild.Services.Database.dbschema /targetmodelfile:VersionedSchemas\v1.0.dbschema /DeploymentScriptFile:NewDeploymentScript.sql /p:TargetDatabase="EnterpriseBuild.Database"
Все отлично работает и генерируется файл newdeployment.sql. Однако, когда я изменяю свой файл.dbproj и включаю его в качестве цели AfterBuilds
<Target Name="AfterBuild">
<!--<Message Text="sample text" Importance="high"></Message>-->
<Exec IgnoreExitCode="false"
WorkingDirectory="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VSTSDB\Deploy\"
Command="vsdbcmd.exe /a:deploy /dd:- /model:obj\Release\EnterpriseBuild.Services.Database.dbschema /targetmodelfile:VersionedSchemas\v1.0.dbschema /DeploymentScriptFile:NewDeploymentScript.sql /p:TargetDatabase="EnterpriseBuild.Database"" />
</Target>
сборка не удалась с
EnterpriseBuild.Services.Database.dbproj(211,5): error MSB3073: The command "vsdbcmd.exe /a:deploy /dd:- /model:obj\Release\EnterpriseBuild.Services.Database.dbschema /targetmodelfile:VersionedSchemas\v1.0.dbschema /DeploymentScriptFile:NewDeploymentScript.sql /p:TargetDatabase="EnterpriseBuild.Database"" exited with code 1.
сообщение.
Может кто-нибудь подсказать, что я делаю не так?
2 ответа
Мне удалось это решить. В основном это делается
<Target Name="AfterBuild">
<!--<Message Text="sample text" Importance="high"></Message>-->
<Exec IgnoreExitCode="false"
WorkingDirectory="C:\Program Files (x86)\Microsoft Visual Studio 10.0\VSTSDB\Deploy\"
Command="vsdbcmd.exe /a:deploy /dd:- /model:obj\Release\EnterpriseBuild.Services.Database.dbschema /targetmodelfile:VersionedSchemas\v1.0.dbschema /DeploymentScriptFile:NewDeploymentScript.sql /p:TargetDatabase="EnterpriseBuild.Database"" />
</Target>
правильно устанавливает рабочий каталог в C:\Program Files(x86).... где моя VersionedSchemas\v1.0.dbschema и т. д. не существует. Хитрость заключалась в том, чтобы сохранить рабочий каталог таким же, как ProjectDirectory, и при этом вызывать VSDBCMD. Мне удалось это сделать
<Exec IgnoreExitCode="false" Command=""C:\Program Files (x86)\Microsoft Visual Studio 10.0\VSTSDB\Deploy\vsdbcmd" /a:deploy /dd:- /model:obj\Release\EnterpriseBuild.Database.dbschema /targetmodelfile:VersionedSchemas\v1.0.dbschema /DeploymentScriptFile:NewDeploymentScript.sql /p:TargetDatabase="EnterpriseBuild.Database"" />
Хитрость заключалась в том, чтобы использовать & quot; вокруг C:\Pro...
Visual Studio также предоставляет $(VSTSDBDirectory) - расположение VSDBCMD.
Задача MSBuild может выглядеть следующим образом:
<Exec Command=""$(VSTSDBDirectory)\Deploy\VSDBCMD" /a:Deploy /q+ /dd:+ /dsp:sql /manifest:"$(OutDir)Database.deploymanifest" /cs:"Integrated Security=SSPI;Persist Security Info=False;Data Source=(local)" /p:AlwaysCreateNewDatabase=true /p:CommentOutSetVarDeclarations=false /p:TargetDatabase="MyDatabase" /Script:"$(OutDir)MyDatabase.sql"" ContinueOnError="false" />