Visual Studio Team System
Per tutti quelli che non seguono il blog di Brian Harry: dalla prossima versione dei Power Tools sarà disponibile una procedura di backup VERAMENTE ALLA PORTATA DI TUTTI! Soprattutto per chi ha installato la versione Basic, i piccoli team che si aspettano una procedura di backup semplificata.
Maggiori informazioni (veramente dettagliate): alla fonte.
Lorenzo ci ha insegnato ad installarlo, ma ancora parlato nessuno ci ha detto "perché é basic"...
Premessa: TFS Basic sarà un'opzione di installazione di TFS 2010 (non un prodotto a parte).
TFS Basic é "solo" il Source Control di TFS, ovvero rispetto a TFS "normale" vi mancano:
- Tutto quello che é legato a Reporting Services (quindi niente grafici ficosi per manager, niente stato di avanzamento dei lavori, statistiche, ecc.). Ovviamente anche il Warehouse non c'é (perché fare statistiche se poi non le mostri a nessuno?).
- Tutto quello che é legato a Sharepoint: quindi niente documentazione allegata (a meno che non vi...
E' stato pubblicato un aggiornamento importante per Team System Web Access: TSWA 2008 SP1. Il download é disponibile anche per la versione in italiano.
Fate attenzione: non si tratta di un update, ma di una full release per cui dovete prima disinstallare la vecchia versione.
Fonte: Hakan Eskic
In TFS l'unico metodo per cancellare un progetto é tramite un tool a linea di comando: TFSDeleteProject. Alcune informazioni relative al progetto poterbbero però sopravvivere anche a questa operazione, in particolare:
- Il TFSWarehouse non subirà alcuna modifica, i dati relativi al progetto rimarranno caricati. Per eliminare questi dati é necessario fare il rebuild del TFSwarehouse (vedi Setupwarehouse)
- Le cartelle dove viene fatto il drop delle build non vengono toccate
- Metadati dei workitem condivisi tra più progetti
- Shelveset che contengono file provenienti da un altro progetto
Maggiori informazioni: qui
Fonte: neno's blog
Problemi con l'installazione di TFS?
TFS non é il classico pacchetto Microsoft con un installazione "Avanti-Avanti-Fine" e spesso possono esserci dei problemi. Oltre al solito consiglio di attenervi scrupolosamente alla guida d'installazione (da scaricare nella versione più aggiornata qui) vi segnalo che é stata creata una guida per risolvere i problemi più ricorrenti. La trovate qui.
Fonte: bharry's blog
...se dovesse servirvi, per eliminare i riferimenti al Source Control da una solution VS2003 dovete:
eliminare tutti i file con estensione: vssscc, vspscc, scc, suo
aprire i file di Solution ed eliminare la section "GlobalSection(SourceCodeControl)"
aprire i file di progetto, navigare nel tag <VisualStudioProject> <VisualBasic (o <VisualStudioProject> <CSHARP) ed eliminare gli attributi: SccProjectName, SccLocalPath, SccProvider
Con la doverosa premessa che la paternità di questo post va condivisa con il buon Janky.
Visual Studio .NET 2003 (credo anche 2002, ma, grazie a Dio, non devo pormi questa domanda) ha un comportamento che potrebbe sembrare piuttosto strano rispetto l'interazione tra i progetti Web e il Source Control.
Avete mai provato a scaricare per la prima volta una Web application .NET 1.1 da Team Foundation Server e successivamente aprirla con Visual Studio? Quasi sicuramente vi sarà comparsa una schermata che vi propone di creare il binding tra il vostro codice sorgente ed il famigerato progetto web (che non...
Sempre sulla scia della mia indagine sugli oggetti TeamFoundationServer creati mediante TeamFoundationServerFactory ho notato un altro dettaglio: se creiamo più oggetti con la Factory e poi si invoca Dispose su uno di essi tutti gli oggetti diventano inutilizzabili (perché sono banalmente lo stesso oggetto)!!!
TeamFoundationServer tfs1 = TeamFoundationServerFactory.GetServer("http://tfsrtmsp1:8080");
tfs1.Authenticate();
TeamFoundationServer tfs2 = TeamFoundationServerFactory.GetServer("http://tfsrtmsp1:8080");
tfs2.Authenticate();
tfs1.Dispose();
VersionControlServer vfs2 = (VersionControlServer)tfs2.GetService(typeof(VersionControlServer));
L'ultima linea, infatti, genera una bella NullReferenceException!
In effetti basta verificare che object.ReferenceEquals(tfs1, tfs2) é effettivamente true!
Quindi, se usate la Factory NON fate il dispose del TeamFoundationServer fino alla fine del programma a quando non siete certi che non ne usate più da nessuna parte!!!
La documentazione MSDN in merito al metodo QueryLabels della classe VersionControlServer mi sembra poco chiara. In particolare esistono 3 overloads del metodo:
public
VersionControlLabel[] QueryLabels(string labelName, string labelScope, string owner, bool includeItems);public
VersionControlLabel[] QueryLabels(string labelName, string labelScope, string owner, bool includeItems, string filterItem, VersionSpec versionFilterItem);public
VersionControlLabel[] QueryLabels(string labelName, string labelScope, string owner, bool includeItems, string filterItem, VersionSpec versionFilterItem, bool includeDownloadInfo);
I parametri sono in parte comuni, ma secondo me poco chiari:
labelName: Nome della label cercata, se sconosciuta indicare null.
labelScope: Il teamproject a cui é applicata la label. Potete anche indicare un folder del versioncontrol, ma verrà tenuto conto solo del team project, null se sconosciuto
owner:...
Una piccola nota sul metodo CreateLabel della classe VersionControlServer: l'ID della label da creare passata ovviamente non viene aggiornato, pertanto per avere l'oggetto label corretto é necessario ricaricarlo.
public
virtual
VersionControlLabel CreateLabel(VersionControlLabel label, ItemSpec items, VersionSpec version)
{
VersionControlServer vcs = label.VersionControlServer;
LabelItemSpec item = new
LabelItemSpec(items, version, false);
LabelResult[] res = vcs.CreateLabel(label, new
LabelItemSpec[] { item }, LabelChildOption.Replace);
if (res.Length > 0 && res[0].Status == LabelResultStatus.Created)
{
//Reload label per ottenere l'ID giusto!
label = vcs.QueryLabels(label.Name, label.Scope, label.OwnerName, false)[0];
return label;
}
return
null;
}
Estraendo files da un server Team Foundation la data dei files presenti sul disco viene impostata alla data in cui questi sono stati estratti. Non che ci veda niente di strano, anzi... Purtroppo però numerose persone che erano abiuate ad usare Visual Source Safe sentono questo come un problema (non chiedetemi perché, ma vi garantisco che almeno una decina di persone me l'ha segnalato).
Soluzione? Creare un programmino (console) che imposti la data dei file NON ESTRATTI in base alla data dell'ultimo checkin (scusate la lunghezza):
public static void ChangeDate(string ServerName, string workspaceName, string workspaceOwner, string pattern, bool subDirectories){ TeamFoundationServer tfs...
Mi permetto di sconsigliarvi il connubio... Oltrte al già noto problema di accesso al registry si aggiunge un nuovo problema: se salvate nel nella session degli oggetti Item (files TFS) e cercate di ri-accedere all'oggetto VersionControlServer può darsi che quest'ultimo vi risulti loggato con delle credenziali diverse da quelle che avevano generato l'oggetto Item. In genere succede dopo alcuni minuti di inattività, MA SOLO su un server molto sovraccarico e non sul mio portatile.
Perché? Promesso che appena lo scopro ve lo dico (sono già 2 giorni che cerco la soluzione senza riuscirci).
ATTENZIONE: HO RISOLTO IL PROBLEMA!!! Avevo dei problemi sul disco: ho effettuato uno scandisk e tutto si é felicemente risolto, scusate l'allarmismo, di solito ho gli scandisk pianificati, ma si trattava di un disco esterno che non é sempre connesso! Lascio il post originale (solo leggermente modificato).
Non scaricatela... almeno se avete Vista
Ci deve essere un file bacato: all'inizio del terzo file si blocca come se non ci fosse più spazio sul disco (ma io ho ancora 58 Gb!). Ho già provato ri-scaricando il file 3 e anche riscaricando tutti i files, ma il risultato é lo stesso!
...aspettando...
Se cercate di creare un oggetto TeamFoundationServer da un thread che gira con un account utente che non ha le credenziali di scrittura sul registry incapperete nell'eccezione [SecurityException: Requested registry access is not allowed.] (come già descritto qui).Grazie all'inossidabile Lorenzo ed ai suoi preziosi contatti ho trovato la soluzione.
Sostanzialmente (se ho ben capito) se specifico un server nei metodi (ed i loro rispettivi overloads):TeamFoundationServerFactory.GetServer(serverName)new TeamFoundationServer(serverName)passando come parametro il SOLO NOME del server viene effettuato dapprima un accesso in lettura alla chiave:HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\TeamFoundation\Serversper verificare se esiste un server memorizzato con il nome passato, dappoi tenta l'accesso al server specificato sulla porta standard (8080)....
E se il mio utente non ha permesso di scrivere nel registry?!Risposta:
System.ThrowHelper.ThrowSecurityException(ExceptionResource resource) +48Microsoft.Win32.RegistryKey.OpenSubKey(String name, Boolean writable) +2780921 Microsoft.TeamFoundation.Client.RegisteredServers.OpenCurrentUser(Boolean writable, Boolean shouldCreate) +50 Microsoft.TeamFoundation.Client.RegisteredServers.GetUriForServer(String serverName) +43 Microsoft.TeamFoundation.Client.TeamFoundationServer.GetUriForName(String name) +93 Microsoft.TeamFoundation.Client.TeamFoundationServer.get_Uri() +25 Microsoft.TeamFoundation.Client.CheckAuthenticationProxy..ctor(TeamFoundationServer server) +22 Microsoft.TeamFoundation.Client.TeamFoundationServer.Authenticate(Boolean useProvider, ICredentialsProvider provider) +58 Microsoft.TeamFoundation.Client.TeamFoundationServer.Authenticate() +17
E tutto questo per memorizzare l'elenco dei server conosciuti per l'utente... Direi che sono DISCRETAMENTE senza parole... alla faccia di sviluppare con zero privilegi!!! Francamente per quanto mi sforzi non riesco a trovare nessuna soluzione SPECIALMENTE perché la mia é un'applicazione ASP.NET che dovrebbe girare con impersonation!!! :-S