Развертывание проекта создания базы данных с помощью MSBuild через код значительно дольше в режиме отладки, чем в выпуске.

Я использую механизм MSBuild для запуска развертывания в проекте базы данных Team Server:

var propertyGroup = new BuildPropertyGroup();
propertyGroup .SetProperty("Configuration", "Release");
propertyGroup .SetProperty("TargetDatabase", <databasename>);
propertyGroup .SetProperty("UseSandboxSettings", "false");
propertyGroup .SetProperty("DeployToDatabase", "true");
propertyGroup .SetProperty("TargetConnectionString", LocalHostConnectionString);
new Engine().BuildProjectFile(<DBProjFile>, new[] { "Rebuild", "Deploy" }, propertyGroup);

Это выполняется в установочном приспособлении для набора модульных тестов. При запуске с использованием Resharper установка выполняется за разумное время, однако, если я отлаживаю тесты, я получаю много шума трассировки в выводе отладки. Большинство сообщений регистрируются на подробном уровне.

Я проанализировал некоторые задействованные сборки и обнаружил, что существует TraceSource с именем «TSData», созданный в статическом классе Microsoft.Data.Schema.Common.Diagnostics.TSDTrace, Microsoft.Data.Schema.Utilities.

Я попытался применить следующее к app.config, который остановил любой вывод, появляющийся в окне отладки, но время выполнения не пострадало:

<system.diagnostics>
    <sources>
        <source name="TSData" switchName="foo" />
    </sources>
    <switches>
        <add name="foo" value="Off"/>
    </switches>
</system.diagnostics>

В классе ведения журнала есть эта маленькая жемчужина:

if (TSDTrace.Settings._traceIfDebuggerAttached && Debugger.IsAttached)
{
    TSDTrace.Settings._traceToDebugOutput = true;
    TSDTrace.Settings._traceLevel = TraceLevel.Verbose;
}

Где _traceIfDebuggerAttached всегда истинно. Я прыгаю, что я что-то пропустил. В конечном итоге я хотел бы отключить это из кода, но я бы согласился на решение, связанное с конфигурацией приложения.

ИЗМЕНИТЬ

Я допустил ошибку, источником трассировки на самом деле является «TSData», который я изменил выше. Я установил для уровня журнала значение «Выкл.» в app.config, что предотвратило появление вывода в выводе отладки, но скорость осталась прежней. Похоже, эта проблема более специфична для того, что я пытаюсь сделать, поэтому я добавил больше деталей к исходному вопросу.


person Bronumski    schedule 22.06.2011    source источник


Ответы (1)


Кажется, что Microsoft.Build.BuildEngine.Engine устарел, вместо этого я должен был использовать Microsoft.Build.Evaluation.ProjectCollection.

Я изменил код для использования нового объекта, и все работает намного быстрее, и мне не нужно пытаться отключить ведение журнала с помощью системной диагностики в файле журнала. Код теперь гласит:

var properties = new Dictionary<string, string>
    {
        {"Configuration", isDebug ? "Debug" : "Release"},
        {"TargetDatabase", databaseName},
        {"UseSandboxSettings", "false"},
        {"DeployToDatabase", "true"},
        {"TargetConnectionString", LocalHostConnectionString}
    };

using (var engine = new ProjectCollection(properties))
{
    engine.RegisterLogger(new ConsoleLogger());

    engine
        .LoadProject(databaseProjectFileName, "4.0")
        .Build(new[] {"Build", "Deploy"});
}
person Bronumski    schedule 27.07.2011