TFSBuild - Развертывание базы данных - Нарушение блокировки файла - PullRequest
1 голос
/ 18 октября 2011

Я унаследовал систему, которая требует развертывания dbschema для нескольких баз данных (по одной на клиент), и настроил ночную сборку для развертывания изменений на моем уровне (пример ниже).Примерно в 50% случаев он работает отлично, но в другие 50% я получаю сообщение об ошибке где-то в середине сборки:

"d: \ builds {Project} \ Dev Nightly Database Update \ \BuildType \ TFSBuild.proj "(цель EndToEndIteration) (1) ->" d: \ builds {Project} \ Ночное обновление базы данных Dev \ Sources \ Database \ Database.dbproj "(перестроить; цель развертывания) (3:18) ->(Цель DspDeploy) -> C: \ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ TeamData \ Microsoft.Data.Schema.TSqlTasks.targets (120,5): ошибка MSB4018: задача «SqlDeployTask» неожиданно завершилась неудачей.[d: \ builds {Project} \ Ночное обновление базы данных Dev \ Sources \ Database \ Database.dbproj] C: \ Program Files \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ TeamData \ Microsoft.Data.Schema.TSqlTasks.targets (120,5): ошибка MSB4018: имеется нарушение блокировки файла.Закройте все внешние приложения, которые используют файл базы данных.[d: \ builds {Project} \ Dev Nightly Database Update \ Sources \ Database \ Database.dbproj]

Я осмотрелся, но не нашел никаких реальных решений.Я предполагаю, что получаю ошибку, потому что msbuild все еще использует файл dbproj при запуске следующей итерации.Я пытался поставить задачу «Сон» в качестве последнего усилия, но это не помогло вообще.

Любые другие предложения?

<Target Name="Client DB Deploy" Outputs="%(Database.Name)">
<MSBuild Projects="$(SolutionRoot)\Database\Database.dbproj"
   Properties="Configuration=Default; OutDir=$(BinariesRoot)\$(Configuration)\;  
          DeployToDatabase=True;TargetDatabase=%(Database.Name);
          TargetConnectionString=Data Source=$(DatabaseServer)%3BIntegrated Security=True;
          AlwaysCreateNewDatabase=False;BlockIncrementalDeploymentIfDataLoss=False"
   Targets="Rebuild;Deploy"  />
<Copy SourceFiles="$(OutDir)..\Database.sql" DestinationFolder="$(OutDir)_SetupPackages\_Database\%(Database.Name)" />
<SleepTask Timeout="10000" /> <!--sleep the build to try and avoid file locks we get in the loop-->

1 Ответ

0 голосов
/ 20 октября 2011

Попробуйте добавить параметры задачи MSBuild RunEachTargetSeparately = "True" или UnloadProjectsOnCompletion = "True". Смотри http://msdn.microsoft.com/en-us/library/z7f65y0d.aspx

...