2012-02-29 47 views
1

我可能在這裏丟失了一些基本的東西,因爲這似乎並沒有像我期望的那樣工作。我不是一個真正的C#人白天。以.net 3.5編程方式訪問和更新tfs 2010生成參數

我有一個tfs 2010插件,它正在觀看票務更改事件並過濾我需要的票據的WIT更改。這一切都基於http://geekswithblogs.net/jakob/archive/2010/10/27/devleoping-and-debugging-server-side-event-handlers-in-tfs-2010.aspx

我拔出插件中的所有必要變量,我需要將其傳遞給構建引擎,這將實際上推動構建。這裏給我的最悲傷的事情是參數被推送爲xaml字符串或「字典並將其序列化爲字符串」。現在,有一個庫Microsoft.TeamFoundation.Build.Workflow可以對此進行一些處理,但它似乎適用於.net 4,並且tfs服務器在.net 2中運行,並且無法綁定它。在廣泛鏈接的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文檔,我可以如何解決和更新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

好吧,我闖入了它。不知道它是最有效的方式,但它似乎工作:

 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

由於Build環境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中。我經常在PowerShell中工作,只是把它作爲一個測試。我試圖從tfs插件隊列構建,我想避免啓動powershell env只是爲了傳遞一些變量。另外,這樣做似乎很愚蠢,只是爲了避免在c#中解析xml ... – cornasdf 2012-03-05 11:33:03