2

Visual Studio 2012. Проект базы данных SQL Server.MSBuild & SQL Server Database Project: привязать развертывание и опубликовать назначение к конфигурации сборки

Конфигурации с четырьмя конфигурациями были созданы в решении: Debug, DevDb, TestDb, LocalDb.

Три публикующие профили были созданы в проекте: (!) DevDb.publish.xml, TestDb.publish.xml, LocalDb.publish.xml

Нажатие кнопки F5 Я хочу:

  • развернуть проект со строкой подключения от свойств проекта если конфигурация сборки Отладка.
  • опубликовать проект с строки подключения из соответствующих профилей публикации если конфигурации сборки DevDb, TestDB или LocalDB.

Для этого я редактирования проекта (.sqlproj) XML, пытаясь поймать вызов цели Deploy и заменить целевой стандарт Deploy с пользовательским поведением:

<Target Name="Deploy">  

    <!-- The first statment is for Debug configuration --> 

    <MSBuild Condition=" '$(Configuration)' == 'Debug' " 
     Targets="Deploy" 
     Projects="$(MSBuildProjectFile)" 
     Properties="Configuration=$(Configuration);" 
    /> 

    <!-- The second statement is for DevDb, TestDb, LocalDb configurations --> 

    <MSBuild Condition=" '$(Configuration)' != 'Debug' " 
     Targets="SqlPublish" 
     Projects="$(MSBuildProjectFile)" 
     Properties="SqlPublishProfilePath=$(Configuration).publish.xml; 
        Configuration=$(Configuration);" 
    />  
</Target> 

Второй оператор работает отлично и я получаю развертывание в нужном месте.

Проблема заключается в первом утверждении - она ​​создает круговую зависимость.

ошибка MSB4006: в графе зависимостей цели используется круговая зависимость, включающая целевое «развертывание».

Мой вопрос: как пересечь (уловить и заменить) стандартную цель, и если требуется снова вызвать стандартную цель?

Или я пытаюсь изобретать велосипед, и есть другой способ сделать то, что я хочу? (Что я хочу, описано выше под словами «Нажатие кнопки F5» :)

ответ

3

Я думаю, что у меня есть решение.

Так что, если мы ставим такую ​​PropertyGroup с состоянием и настраиваемой Target до конца проекта базы данных XML файла:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 

    ----------- Skip ----------- 

    <PropertyGroup Condition=" '$(Configuration)' != 'Debug' and Exists('$(Configuration).publish.xml')"> 
    <DeployDependsOn> 
     PublishDatabase 
    </DeployDependsOn> 
    </PropertyGroup> 

    <Target Name="PublishDatabase"> <!-- Custom Target --> 
    <Message 
     Text="Deploy is replaced with SqlPublish for configuration = $(Configuration)" 
     Importance="high" /> 

    <MSBuild 
     Targets="SqlPublish" 
     Projects="$(MSBuildProjectFile)" 
     Properties="SqlPublishProfilePath=$(Configuration).publish.xml; 
        Configuration=$(Configuration);" /> 
    </Target> 
</Project> 

мы получим следующее поведение:

  • Если сборка решения конфигурация отличается от Debug, и профиль публикации * .publish.xml существует, то операция Deploy target и будет заменена целевым объектом SqlPublish, и эта публикация получит необходимую конфигурацию, такую ​​как connecti на строке из соответствующего профиля публикации.
  • Если конфигурацией сборки решения является Debug, то мы сохраняем стандартное поведение Visual Studio, когда оно берет строку соединения из свойств проекта.