Sql Project Publish заменяет Deploy - как подавить управление версиями и подключиться к сборке tfs
Мы используем SSDT Sql Server 2012, который убрал опцию развертывания в Visual Studio для проектов баз данных (теперь это проекты sql). Мы хотели бы автоматизировать шаг публикации, как это было для развертывания, но не совсем ясно, как это сделать. Итак, пара вопросов:
Я добавил.publish.xml в проект (после первой публикации вручную, проверка добавления в проект). Даже после этого и установки его по умолчанию, когда я дважды щелкаю по нему, он строит, но всегда всплывает окно настроек, где мне нужно нажать кнопку "Опубликовать", чтобы продолжить. Есть ли параметр, который пропустил бы это приглашение и использовал бы текущие значения?
Кажется, что каждая публикация генерирует версию вывода sql. Как я могу подавить это - т.е. каждый раз перезаписывать базовый файл?
И, наконец, приветствуются любые указатели для обновления сборки для использования нового типа проекта и команды публикации для автоматизированных сборок.
3 ответа
Как восстановить параметр "Развернуть": (только для Visual Studio 2010/2012 - это больше не поддерживается в Visual Studio 2013)
Опция Deploy по-прежнему присутствует, но по какой-то причине она недоступна в меню. (Проклятая команда Visual Studio!) Я решил эту проблему, добавив параметр "Развернуть" на одну из панелей инструментов следующим образом:
- Нажмите на стрелку с правой стороны панели инструментов.
- Нажмите "Добавить или удалить кнопки", затем "Настроить".
- В диалоговом окне "Настройка" нажмите "Добавить команду".
- Выберите категорию "Build", затем выберите команду "Deploy Selection".
- После сохранения вашего выбора на панели инструментов появится опция "Развернуть [имя проекта]". Вам нужно будет выбрать свой проект в обозревателе решений, чтобы кнопка стала активной.
Обратите внимание, что параметры развертывания отличаются от параметров публикации. Параметры развертывания настраиваются в свойствах проекта на вкладке "Отладка".
Чтобы ответить на ваши вопросы об опции публикации:
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, как обычно, чтобы файл.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 может быть другим.
Лучший способ, который я нашел для автоматизации развертывания проектов баз данных SSDT, - это использовать msbuild. Первоначально мы использовали VSTSDB и использовали msbuild для файла *.dbproj. Как оказалось, аргументы для развертывания файлов sqlproj точно такие же.
Поскольку старый список аргументов работает для нас, я не переключился на использование стиля файла public.xml. Там довольно много документации для vsdbcmd.exe и msbuild против dbproj. Я бы использовал это как ссылку.
Вот список аргументов и вывод выполнения, как мы его определили для выполнения 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
Я признаю, что немного опоздал на вечеринку, но, возможно, это поможет другим, кто наткнется на эту дискуссию. Моя компания в настоящее время переезжает на VS2012, и у нас есть все те же проблемы, что и у Кейта. Я нашел обходные пути для № 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