Построение базы данных Развертывание проекта с помощью MSBuild через код значительно дольше в Debug, чем в Release - PullRequest
0 голосов
/ 22 июня 2011

Я использую движок 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 всегда имеет значение true.Я прыгаю, что я что-то пропустил.В конечном итоге я хотел бы отключить это из кода, но я бы согласился на решение, включающее конфигурацию приложения.

РЕДАКТИРОВАТЬ

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

1 Ответ

0 голосов
/ 27 июля 2011

Кажется, что 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"});
}
...