2012-02-29 5 views
1

.NET私はおそらくここに基本的な何かが足りないのですからプログラムTFS 2010のビルドパラメータを更新します。私は本当にC#の人ではない。アクセスし、これはちょうど私が期待する方法を動作していないように見えるとして3.5

私が欲しいのチケットへのWITの変更のためのチケットの変更イベントやフィルタリングを見ているTFS 2010のプラグインを持っています。これはすべてhttp://geekswithblogs.net/jakob/archive/2010/10/27/devleoping-and-debugging-server-side-event-handlers-in-tfs-2010.aspx

に基づいています。私はプラグインに必要なすべての変数を取り出し、ビルドエンジンに渡して実際にビルドをプッシュする必要があります。私に最も悲しみを与えているのは、パラメータがxaml文字列または "辞書"としてプッシュされ、それを文字列にシリアライズすることです。さて、このいくつかの処理を行いますが、.NET 4とTFSサーバー.NET 2で実行されているし、それをバインドすることはできませんのためにあるように思わライブラリMicrosoft.TeamFoundation.Build.Workflowがあります。その方法は、広くリンクされているhttp://blogs.msdn.com/b/jpricket/archive/2010/03/25/tfs2010-queuing-a-build-from-code-with-custom-process-parameter-values.aspxで議論されていますが、彼は私がアクセスできないDeserialzeProcessParametersメソッドを使用しています。

私はいくつかの値を更新しようとしていると私はPowerShellの数行の中でこれを行うことができますので、私はそれを自分自身に取り組むことができるだろうと思ったが、私はトラブルに実行しています。

ビルドリクエストのデフォルトのBuildrequest.parametersは、次のようになります(新しい行に変換された/ r/n、XmlDocumentのinnerXmlとして解析できます)。

私は以下のようなxmlドキュメントを持っていますが、C#ではどのようにRestoreDatabaseの値を扱い、更新できますか?

<Dictionary x:TypeArguments="x:String, x:Object" xmlns="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:mtbw="clr-namespace:Microsoft.TeamFoundation.Build.Workflow;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:mtbwa="clr-namespace:Microsoft.TeamFoundation.Build.Workflow.Activities;assembly=Microsoft.TeamFoundation.Build.Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
      <mtbwa:BuildSettings x:Key="BuildSettings" ProjectsToBuild="$/EJTest/TFSServerEventHandler/TFSServerEventHandler.sln"> 
          <mtbwa:BuildSettings.PlatformConfigurations> 
              <mtbwa:PlatformConfigurationList Capacity="0" /> 
          </mtbwa:BuildSettings.PlatformConfigurations> 
      </mtbwa:BuildSettings> 
      <mtbwa:TestSpecList x:Key="TestSpecs" Capacity="0" /> 
      <mtbwa:CodeAnalysisOption x:Key="RunCodeAnalysis">Never</mtbwa:CodeAnalysisOption> 
      <x:Boolean x:Key="AssociateChangesetsAndWorkItems">False</x:Boolean> 
      <x:Boolean x:Key="CreateWorkItem">False</x:Boolean> 
      <x:Boolean x:Key="DropBuild">False</x:Boolean> 
      <x:Boolean x:Key="PerformTestImpactAnalysis">False</x:Boolean> 
      <x:Boolean x:Key="CreateLabel">False</x:Boolean> 
      <x:Boolean x:Key="DisableTests">True</x:Boolean> 
      <mtbw:BuildVerbosity x:Key="Verbosity">Detailed</mtbw:BuildVerbosity> 
      <x:String x:Key="BuildNumber">4.4.2.29</x:String> 
      <x:String x:Key="BackupDatabase">yes</x:String> 
      <x:String x:Key="RestoreDatabase">Yes</x:String> 
      <x:String x:Key="OverwriteBackup">Yes</x:String> 
      <x:String x:Key="UpgradeSoftware">No</x:String> 
      <x:String x:Key="DeploymentTicket">654</x:String> 
</Dictionary> 

x:文字列の値は、更新および変更したい値です。何が価値があるために

、PS版

[xml]$a = Get-Content .\test.xml 
$b = $a.Dictionary.string | where {$_.key -eq "CustomerData"} 
$b."#text" = 'No' 

お時間をありがとう。

答えて

1

[OK]を、私はそれを介して自分の道を打ちました。最も効率的な方法であるかどうかはわかりませんが、うまくいくようです。

 XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load("test.xml"); 
     XmlNodeList elemList = xDoc.GetElementsByTagName("x:String"); 

     foreach (XmlNode xNode in elemList) 
     { 
      switch (xNode.Attributes[0].Value) 
      { 
       case "BuildNumber": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 

       case "BackupDatabase": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 

       case "RestoreDatabase": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 

       case "OverwriteBackup": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 

       case "UpgradeSoftware": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 

       case "DeploymentTicket": 
        Console.WriteLine(xNode.Attributes[0].Value + " = " + xNode.InnerText); 
        xNode.InnerText = "4.3w2432.2"; 
        break; 


      } 
0

ビルド環境dllは.net 4.0 dllであり、現在のdllはアダプタを使用する必要があります(http://code.msdn.microsoft.com/windowsdesktop/Using-a-NET-4-Based -DLL-bb141db3、この方法では、オブジェクトモデルを使って正常にビルドを開始できます)、またはコードからtfsbuild.exeを使用してビルドを実行することができます。これは、値がシリアル化されていないためです。

あなたはPowerShellで同じ機能を記載されているので、私はあなたがPowerShellですでにどこ思いました。その場合、ビルドのキックにtfsbuild.exeコマンドラインを起動することができます。これはそうではありません。

+0

ありがとうございましたが、私はpowershellに参加するつもりはありませんでした。私はパワーシェルでより頻繁に働き、テストとしてそれを取り上げました。私はtfsプラグインからビルドをキューに入れようとしています。私はいくつかの変数を渡すためにpowershell envを起動しないようにしたいと思います。プラスそれはちょうどC#のXMLを解析することを避けるために行うにはばかげているようだ... – cornasdf

関連する問題