2009-12-01 7 views
12

che sto cercando di tirare l'ultima versione del codice sorgente di TFS di programmazione utilizzando l'SDK, e quello che ho fatto in qualche modo non funziona:Come si ottiene l'ultima versione del codice sorgente utilizzando l'SDK di Team Foundation Server?

string workspaceName = "MyWorkspace"; 
string projectPath = "/TestApp"; 
string workingDirectory = "C:\Projects\Test\TestApp"; 

VersionControlServer sourceControl; // actually instantiated before this method... 

Workspace[] workspaces = sourceControl.QueryWorkspaces(workspaceName, sourceControl.AuthenticatedUser, Workstation.Current.Name); 
if (workspaces.Length > 0) 
{ 
    sourceControl.DeleteWorkspace(workspaceName, sourceControl.AuthenticatedUser); 
} 
Workspace workspace = sourceControl.CreateWorkspace(workspaceName, sourceControl.AuthenticatedUser, "Temporary Workspace"); 
try 
{ 
    workspace.Map(projectPath, workingDirectory); 
    GetRequest request = new GetRequest(new ItemSpec(projectPath, RecursionType.Full), VersionSpec.Latest); 
    GetStatus status = workspace.Get(request, GetOptions.GetAll | GetOptions.Overwrite); // this line doesn't do anything - no failures or errors 
} 
finally 
{ 
    if (workspace != null) 
    { 
     workspace.Delete(); 
    } 
} 

L'approccio è fondamentalmente la creazione di uno spazio di lavoro temporaneo, utilizzando il metodo Get() per afferrare tutti gli elementi per questo progetto e quindi rimuovere lo spazio di lavoro. È questo il modo corretto per farlo? Qualsiasi esempio sarebbe utile.

risposta

5

Il tuo approccio è valido.

L'errore si trova nel percorso del progetto. Usa qualcosa come questo, invece:

string projectPath = "$/PathToApp/TestApp"; 
1

Sono d'accordo con Joerage che il percorso del server è probabilmente il colpevole. Per ottenere maggiori informazioni su ciò che sta accadendo, è necessario collegare alcuni eventi sull'oggetto VersionControlServer. Al minimo vorrai Ottenere, NonFatalError e Conflict.

Lista completa: http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.versioncontrolserver_events(VS.80).aspx

+0

Mi scuso per il ritardo nella risposta, come mi sono coinvolti in una questione diversa, ma cambiando neanche il percorso sembrava funzionare. Ho provato a collegare tutti gli eventi e nessuno di loro ha sparato. Ho finito per utilizzare una strategia completamente diversa (item.DownloadFile) e in quel modo sembrava funzionare bene - e non erano necessari spazi di lavoro. –

+0

@JohnRasch, potresti condividere lo snippet di codice in quanto sono colpito dallo stesso problema? !! :( – UserAR

10

ho finito per usare un approccio diverso che sembra funzionare, prendendo principalmente vantaggio del metodo Item.DownloadFile():

VersionControlServer sourceControl; // actually instantiated... 

ItemSet items = sourceControl.GetItems(sourcePath, VersionSpec.Latest, RecursionType.Full); 

foreach (Item item in items.Items) 
{ 
    // build relative path 
    string relativePath = BuildRelativePath(sourcePath, item.ServerItem); 

    switch (item.ItemType) 
    { 
    case ItemType.Any: 
     throw new ArgumentOutOfRangeException("ItemType returned was Any; expected File or Folder."); 
    case ItemType.File: 
     item.DownloadFile(Path.Combine(targetPath, relativePath)); 
     break; 
    case ItemType.Folder: 
     Directory.CreateDirectory(Path.Combine(targetPath, relativePath)); 
     break; 
    } 
} 
6

ho completato e implementato il codice in un pulsante come web soluzione asp.net.

Per il progetto di lavorare nei riferimenti dovrebbero essere aggiunti i Microsoft.TeamFoundation.Client e Microsoft.TeamFoundation.VersionControl.Client riferimenti e nel codice le dichiarazioni using Microsoft.TeamFoundation.Client; e using Microsoft.TeamFoundation.VersionControl.Client;

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string workspaceName = "MyWorkspace"; 
     string projectPath = @"$/TeamProject"; // the container Project (like a tabel in sql/ or like a folder) containing the projects sources in a collection (like a database in sql/ or also like a folder) from TFS 

     string workingDirectory = @"D:\New1"; // local folder where to save projects sources 

     TeamFoundationServer tfs = new TeamFoundationServer("http://test-server:8080/tfs/CollectionName", System.Net.CredentialCache.DefaultCredentials); 
                  // tfs server url including the Collection Name -- CollectionName as the existing name of the collection from the tfs server 
     tfs.EnsureAuthenticated(); 

     VersionControlServer sourceControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 

     Workspace[] workspaces = sourceControl.QueryWorkspaces(workspaceName, sourceControl.AuthenticatedUser, Workstation.Current.Name); 
     if (workspaces.Length > 0) 
     { 
      sourceControl.DeleteWorkspace(workspaceName, sourceControl.AuthenticatedUser); 
     } 
     Workspace workspace = sourceControl.CreateWorkspace(workspaceName, sourceControl.AuthenticatedUser, "Temporary Workspace"); 
     try 
     { 
      workspace.Map(projectPath, workingDirectory); 
      GetRequest request = new GetRequest(new ItemSpec(projectPath, RecursionType.Full), VersionSpec.Latest); 
      GetStatus status = workspace.Get(request, GetOptions.GetAll | GetOptions.Overwrite); // this line doesn't do anything - no failures or errors 
     } 
     finally 
     { 
      if (workspace != null) 
      { 
       workspace.Delete(); 
       Label1.Text = "The Projects have been brought into the Folder " + workingDirectory; 
      } 
     } 
    } 
0

ho avuto una situazione simile in cui avevo bisogno di scaricare contenuti di 'un 'cartella da tfs in un'area di lavoro esistente, senza creare un nuovo spazio di lavoro. Con l'aiuto delle risposte di cui sopra, sono stato in grado di mettere insieme qualcosa che funziona bene per me al momento. C'è tuttavia una limitazione. Questo funziona per i contenuti della cartella 'a' con solo file e non un'altra cartella al suo interno - Non l'ho provato. Forse ciò comporterebbe alcuni aggiornamenti minori. Condivisione del codice, nel caso qualcuno stia cercando questo. Mi piace molto il fatto che questo approccio non abbia a che fare con lo spazio di lavoro [-creare ed eliminare], poiché ciò non è desiderato.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Configuration; 
using Microsoft.TeamFoundation.VersionControl.Client; 
using Microsoft.TeamFoundation.Client; 
using System.IO; 

namespace DownloadFolder 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string teamProjectCollectionUrl = "http://<YourTFSUrl>:8080/tfs/DefaultCollection"; // Get the version control server 
      TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri(teamProjectCollectionUrl)); 
      VersionControlServer vcs = teamProjectCollection.GetService<VersionControlServer>(); 
      String Sourcepath = args[0]; // The folder path in TFS - "$/<TeamProject>/<FirstLevelFolder>/<SecondLevelFolder>" 
      String DestinationPath = args[1]; //The folder in local machine - "C:\MyTempFolder" 
      ItemSet items = vcs.GetItems(Sourcepath, VersionSpec.Latest, RecursionType.Full); 
      String FolderName = null; 
      foreach (Item item in items.Items) 
      { 
       String ItemName = Path.GetFileName(item.ServerItem); 
       switch (item.ItemType) 
       { 
        case ItemType.File:       
         item.DownloadFile(Path.Combine(DestinationPath, FolderName, ItemName)); 
         break; 
        case ItemType.Folder: 
         FolderName = Path.GetFileName(item.ServerItem); 
         Directory.CreateDirectory(Path.Combine(DestinationPath, ItemName)); 
         break; 
       } 
      } 
     } 
    } 
} 

Durante l'esecuzione di questo dal prompt dei comandi copiare tutte le DLL di supporto insieme a exe cmd >>DownloadFolder.exe "$/<TeamProject>/<FirstLevelFolder>/<SecondLevelFolder>" "C:\MyTempFolder"

Problemi correlati