2011-01-17 8 views
8

Sto provando a modificare i nostri script di compilazione dall'utilizzo di SourceSafe a TFS senza utilizzare MsBuild (ancora).Puoi fare un TFS senza avere bisogno di uno spazio di lavoro?

Un inconveniente è che la directory dello spazio di lavoro viene rinominata e archiviata dagli script, il che fa pensare a TFS che non è necessario ottenere alcun file. Anche con il flag /force ottiene semplicemente le directory senza ottenere i file di origine.

Attualmente sto usando

TF.exe get "Product/Main/Project1" /force /recursive /noprompt 

Per salvare me gestire le aree di lavoro negli script o utilizzando directory intermedie, qualcuno sa di un comando che può ottenere le directory e il codice senza bisogno di uno spazio di lavoro?

risposta

13

Non è possibile eseguire uno tf get senza un'area di lavoro. Il motivo è che il server deve conoscere la mappatura tra i percorsi del server e i percorsi locali.

Se si lavora con un gran numero di file, non è una buona idea:

  1. Creare & Eliminare una nuova area di lavoro ogni volta
  2. Oppure, creare una nuova area di lavoro (e poi mai cancellarlo)

La ragione di ciò è che ogni volta che si esegue uno Get, il server tiene traccia di quali file, con quali versioni sono stati scaricati in quale area di lavoro. Se non si puliscono mai questi spazi di lavoro, la tabella che memorizza queste informazioni crescerà nel tempo.

Inoltre, se si sta creando & eliminando un'area di lavoro in qualsiasi momento, il server deve scrivere tutte queste righe, quindi eliminarle quando si è terminato. Questo non è necessario.

Si dovrebbe davvero provare e riutilizzare lo stesso spazio di lavoro ogni volta. Se lo fai, il server è molto efficiente nell'inviare solo i file che sono cambiati dall'ultima volta che li hai scaricati.Anche se la tua build si sta spostando da un ramo all'altro, puoi usare tf get /remap che a volte è più efficiente se le filiali condividono file comuni.

Sebbene non risolva il problema, è possibile elencare file e scaricare file senza un'area di lavoro.

Per elencare i file:

tf dir $/Product/Main/Project1 /R 

Per scaricare un file:

tf view $/Product/Main/Project1/file.cs 

Con un file batch creativo, è possibile stringa di questi due insieme con un comando FOR. Tuttavia, raccomanderei innanzitutto di provare a risolvere il problema del workspace, poiché questo è il modo in cui TFS è stato progettato per essere utilizzato.

+0

Ok, sembra che il percorso di minor resistenza sia controllare il codice in uno spazio di lavoro stabile, quindi copiare il codice da lì nelle directory di lavoro dello script di build. –

+0

hai pensato di impegnarti nella proposta di alm stackexchange dello studio visivo? http://area51.stackexchange.com/proposals/15894/visual-studio-alm?referrer=VS9uwfDzMKasH8mQCaDCxQ2 –

+0

Questa soluzione è più pulita poiché implica solo ottenere (non sono necessarie operazioni di spostamento dei file): http://stackoverflow.com/questions/10624031/how-to-perform-a-tfs-get-to-a-a-current-directory-path-ignoring-works –

0

Non so perché i propri script estrapolano le directory degli spazi di lavoro ogni volta. Ma per rispondere alla tua domanda non penso che tu possa ottenere il codice sorgente da TFS senza uno spazio di lavoro. Forse puoi provare a creare un spazio ogni volta prima di te. Il comando è

tf.exe workspace /new 
+0

L'area di lavoro è stata cancellata per garantire che non fossero in uso file memorizzati accidentalmente. Non è un grosso problema copiare tutto in una diversa directory di lavoro che viene invece cancellata. –

3

Uno spazio di lavoro è una mappatura tra il percorso del repository di origine e la posizione del file system, quindi non non si può farla franca non si utilizza uno spazio di lavoro. Ma puoi facilmente impostare e abbattere uno spazio di lavoro quando è necessario.

Ecco un semplice task TFS che utilizzo per ottenere i file di origine del database da TFS prima di apportare alcune sostituzioni di testo e di costruirle in un pacchetto di aggiornamento del database. Si può facilmente tradurre questo testo a qualsiasi sintassi vostri script di build attuali richiedono:

<Target Name="GetDatabaseSources"> 
    <!-- clean out the folder before doing the fresh get of the database sources --> 
    <Folder.CleanFolder Path="$(DatabaseBuildBaseLocation)" Force="true"/> 

    <!-- create a workspace for the database source of the product --> 
    <CallTarget Targets="CreateDatabaseSourceWorkspace" /> 
    <!-- get the database sources for the product --> 
    <Get TeamFoundationServerUrl="$(TeamFoundationServerUrl)" Workspace="$(DatabaseSourceWorkspaceName)" Recursive="true" Version="$(DatabaseSourceVersion)" Force="true" /> 
    <!-- delete the workspace --> 
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" /> 
</Target> 

<!-- creates and maps a temporary workspace for the database source of the product --> 
<Target Name="CreateDatabaseSourceWorkspace"> 
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" /> 
    <Exec Command="$(Tf) workspace /new $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt" /> 
    <Exec Command="$(Tf) workfold /unmap /workspace:$(DatabaseSourceWorkspaceName) $/" /> 
    <Exec Command="$(Tf) workfold /map /workspace:$(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) $(DatabaseSourceLocation) &quot;$(DatabaseBuildBaseLocation)&quot;" /> 
</Target> 

TFS è il repository di origine, ma non ha esplicitamente menzionato che cosa i vostri script di build sono stati progettati per. Dovresti davvero migrarli a uno script di compilazione TFS, quindi puoi semplificare la tua build, ad esempio non dovrai preoccuparti di mappare aree di lavoro o ottenere il codice sorgente più recente perché TFS lo fa per te, tutto ciò di cui ti devi preoccupare è eventuali passi di compilazione personalizzati e possibilmente l'archiviazione dei risultati di costruzione.

0

È possibile farlo facilmente con SourceSafe: ottenere qualsiasi versione in qualsiasi directory specifica che si desidera. Ed era molto spesso molto conveniente. Ci sono spesso occasioni per cui si vorrebbe farlo. Vergogna (se) TFS non lo supporta, è una funzionalità mancante, imho.

1

C# ha la libreria VersionControlServer ed è possibile utilizzare la chiamata VersionControlServer.GetItems per recuperare TFS Item. Se ItemType è File, chiamare DownloadFile per recuperare il file.

+0

Questo non è ciò che fa GetItems. 'GetItems' ottiene le informazioni su' Item's in TFS. Non li scarica sul filesystem. –

+0

Mi dispiace, ho omesso informazioni. È possibile utilizzare GetItems per ottenere le informazioni sul file system, quindi è possibile eseguire il loop delle informazioni sull'elemento e chiamare DownloadFile. – Shiv

Problemi correlati