0

MSBuildエンジンを使用して、TeamServerデータベースプロジェクトで展開を実行しています。

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.Utilitiesで作成された「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は常にtrueです。私は何かを逃したことをホッピングしています。最終的にはこれをコードから無効にしたいのですが、アプリの構成を含む解決策を選びます。

編集

私は間違いを犯しました。トレースソースは、上記で修正した実際の「TSData」です。app.configでログレベルをオフに設定しました。これにより、出力がデバッグ出力に表示されなくなりましたが、速度は同じです。この問題は私がやろうとしていることに固有のものであるように思われるので、元の質問にさらに詳細を追加しました。

4

1 に答える 1

0

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"});
}
于 2011-07-27T10:57:33.357 に答える