【问题标题】:Building Database Project deployment with MSBuild via code is considerably longer in Debug than in Release通过代码使用 MSBuild 构建数据库项目部署在 Debug 中比在 Release 中要长得多
【发布时间】:2011-06-22 12:33:13
【问题描述】:

我正在使用 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 运行时,设置会在合理的时间内运行,但是如果我调试测试,我会在调试输出中得到大量的跟踪噪音。大多数消息都以详细级别记录。

我对涉及的一些程序集进行了反思,发现在静态类 Microsoft.Data.Schema.Common.Diagnostics.TSDTrace、Microsoft.Data.Schema 中创建了一个名为“TSData”的 TraceSource。实用程序。

我已尝试将以下内容应用于 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 中将日志级别设置为 Off,这阻止了输出出现在 Debug 输出中,但速度仍然相同。看来这个问题更具体到我正在尝试做的事情,所以我在原始问题中添加了更多细节。

【问题讨论】:

    标签: .net msbuild trace system.diagnostics diagnostics


    【解决方案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"});
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2021-06-09
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多