103 votes

Trouver dans les fichiers : S

Existe-t-il un moyen de rechercher la dernière version de chaque fichier dans TFS à partir d'une chaîne spécifique ou d'une expression rationnelle ? C'est probablement la seule chose qui me manque de Visual Source Safe...

Actuellement, j'effectue un Get Latest sur l'ensemble de la base de code et j'utilise Windows Search, mais cela devient assez pénible avec plus de 1 Go de code dans 75 000 fichiers.

EDITAR : J'ai essayé les powertools mentionnés, mais l'option "Wildcard Search" semble ne rechercher que les noms de fichiers et non les contenus.

UPDATE : Nous avons mis en place une option de recherche personnalisée dans une installation MOSS (Search Server) existante.

60voto

Grant Holliday Points 5748

Team Foundation Server 2015 (sur site) et Visual Studio Team Services (version en nuage) comprennent une prise en charge intégrée de la recherche dans tout votre code et vos éléments de travail.

Vous pouvez effectuer de simples recherches de chaînes de caractères comme foo des opérations booléennes comme foo OR bar ou des choses plus complexes spécifiques au langage comme class:WebRequest

screenshot of code search filter syntax

Vous pouvez en savoir plus à ce sujet ici : https://www.visualstudio.com/en-us/docs/search/overview

3 votes

Voir ma réponse ci-dessous, et upvotez-la ;) C'est désormais possible à partir de TFS 2015 en utilisant la fonction Code Search plugin. marketplace.visualstudio.com/items?itemName=ms.vss-code-search

1 votes

La recherche de code est actuellement disponible uniquement pour Visual Studio Team Services. La prise en charge de Team Foundation Server est en cours de développement et sera incluse dans la prochaine version.

0 votes

La recherche de code est maintenant disponible dans TFS 2017 ou plus récent.

16voto

Dans mon cas, écrire un petit utilitaire en C# m'a aidé. Liens qui m'ont aidé http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

Comment lister les fichiers d'un projet d'équipe en utilisant l'api tfs ?

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

namespace TFSSearch
{
class Program
{
    static string[] textPatterns = new[] { "void main(", "exception", "RegisterScript" };  //Text to search
    static string[] filePatterns = new[] { "*.cs", "*.xml", "*.config", "*.asp", "*.aspx", "*.js", "*.htm", "*.html", 
                                           "*.vb", "*.asax", "*.ashx", "*.asmx", "*.ascx", "*.master", "*.svc"}; //file extensions

    static void Main(string[] args)
    {
        try
        {
            var tfs = TfsTeamProjectCollectionFactory
             .GetTeamProjectCollection(new Uri("http://{tfsserver}:8080/tfs/}")); // one some servers you also need to add collection path (if it not the default collection)

            tfs.EnsureAuthenticated();

            var versionControl = tfs.GetService<VersionControlServer>();

            StreamWriter outputFile = new StreamWriter(@"C:\Find.txt");
            var allProjs = versionControl.GetAllTeamProjects(true);
            foreach (var teamProj in allProjs)
            {
                foreach (var filePattern in filePatterns)
                {
                    var items = versionControl.GetItems(teamProj.ServerItem + "/" + filePattern, RecursionType.Full).Items
                                .Where(i => !i.ServerItem.Contains("_ReSharper"));  //skipping resharper stuff
                    foreach (var item in items)
                    {
                        List<string> lines = SearchInFile(item);
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine("FILE:" + item.ServerItem);
                            outputFile.WriteLine(lines.Count.ToString() + " occurence(s) found.");
                            outputFile.WriteLine();
                        }
                        foreach (string line in lines)
                        {
                            outputFile.WriteLine(line);
                        }
                        if (lines.Count > 0)
                        {
                            outputFile.WriteLine();
                        }
                    }
                }
                outputFile.Flush();
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }
        Console.WriteLine("========");
        Console.Read();
    }

    // Define other methods and classes here
    private static List<string> SearchInFile(Item file)
    {
        var result = new List<string>();

        try
        {
            var stream = new StreamReader(file.DownloadFile(), Encoding.Default);

            var line = stream.ReadLine();
            var lineIndex = 0;

            while (!stream.EndOfStream)
            {
                if (textPatterns.Any(p => line.IndexOf(p, StringComparison.OrdinalIgnoreCase) >= 0))
                    result.Add("=== Line " + lineIndex + ": " + line.Trim());

                line = stream.ReadLine();
                lineIndex++;
            }
        }
        catch (Exception e)
        {
            string ex = e.Message;
            Console.WriteLine("!!EXCEPTION: " + e.Message);
            Console.WriteLine("Continuing... ");
        }

        return result;
    }
}
}

13voto

Vin Points 3945

Il existe une autre solution, qui semble plus attrayante.

  1. Configurer un serveur de recherche - il peut s'agir de n'importe quelle machine/serveur Windows.
  2. Configurer un Service de notification TFS* (Bissubscribe) pour obtenir, supprimer, mettre à jour les fichiers à chaque fois qu'un checkin se produit. C'est donc un service web qui agit comme un auditeur sur le serveur TFS et met à jour/synchronise les fichiers et les dossiers sur le serveur de recherche. - cela améliorera considérablement la précision (recherche en temps réel) et évitera la charge unique que représente l'obtention périodique de données.
  3. Configurer un service d'indexation/Windows recherche indexée sur le serveur de recherche pour le dossier racine
  4. Expose un service web pour retourner des résultats de recherche

Maintenant, avec toutes les configurations ci-dessus, vous avez quelques options pour le client :

  1. Configurer une page web pour appeler le service de recherche et formater les résultats à afficher sur la page web - vous pouvez également intégrer cette page web dans Visual Studio (via une macro ou un add-in).
  2. Créer une interface client Windows (winforms/wpf) pour appeler le service de recherche, formater les résultats et les afficher sur l'interface utilisateur - vous pouvez également intégrer cet outil client dans Visual Studio via VSPackages ou un add-in.

Mise à jour : J'ai suivi cette voie, et cela a bien fonctionné. Je voulais juste ajouter quelque chose.

Liens de référence :

  1. Utilisez cet outil à la place de bissubscribe.exe
  2. Gestion des événements TFS
  3. Notifications du système d'équipe

10voto

muerte Points 1474

Si vous installez les PowerTools de TFS 2008, vous obtiendrez une action "Rechercher dans le contrôle de la source" dans le menu du clic droit de Team Explorer.

TFS2008 Outils électriques

4 votes

C'est drôle qu'on les appelle "outils électriques". Certains diraient que faire quelque chose comme un rollback est une 'fonctionnalité de base' :-)

0 votes

Vous pouvez certainement faire un retour en arrière manuellement, mais ce n'est pas une opération en un clic. Peut-être que ça devrait l'être

3 votes

Bonne réponse, lien mort : microsoft.com/downloads/

6voto

Ok,

  1. TFS2008 Outils électriques faire no ont une fonction de recherche dans les dossiers. "Les outils de recherche dans le contrôle de la source permettent de localiser des fichiers et des dossiers dans le contrôle de la source en fonction du nom de l'élément. statut ou avec un joker expression."

  2. Il y a un programme Windows avec cette fonctionnalité posté sur CodePlex . Je viens de l'installer et de le tester et il fonctionne bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X