البحث في الملفات:ابحث في كل التعليمات البرمجية في Team Foundation Server

StackOverflow https://stackoverflow.com/questions/41039

سؤال

هل هناك طريقة للبحث في أحدث إصدار من كل ملف في TFS عن سلسلة معينة أو regex؟ربما يكون هذا هو الشيء الوحيد الذي أفتقده من Visual Source Safe...

أقوم حاليًا بإجراء "الحصول على الأحدث" على قاعدة التعليمات البرمجية بأكملها واستخدام Windows Search، ولكن هذا يصبح مؤلمًا للغاية مع وجود أكثر من 1 جيجابايت من التعليمات البرمجية في 75000 ملف.

يحرر:قمت بتجربة الأدوات الكهربائية المذكورة، ولكن يظهر خيار "Wildcard Search" للبحث فقط في أسماء الملفات وليس المحتويات.

تحديث:لقد قمنا بتنفيذ خيار بحث مخصص في تثبيت MOSS (خادم البحث) الحالي.

هل كانت مفيدة؟

المحلول

يتضمن Team Foundation Server 2015 (المحلي) وVisual Studio Team Services (الإصدار السحابي) دعمًا مضمنًا للبحث عبر جميع التعليمات البرمجية وعناصر العمل الخاصة بك.

يمكنك إجراء عمليات بحث سلسلة بسيطة مثل foo, العمليات المنطقية مثل foo OR bar أو أشياء أكثر تعقيدًا خاصة باللغة مثل class:WebRequest

screenshot of code search filter syntax

يمكنك قراءة المزيد عنه هنا: https://www.visualstudio.com/en-us/docs/search/overview

نصائح أخرى

في حالتي، ساعدتني كتابة أداة صغيرة بلغة C#.الروابط التي ساعدتني -http://pascallaurin42.blogspot.com/2012/05/tfs-queries-searching-in-all-files-of.html

كيفية إدراج ملفات مشروع الفريق باستخدام tfs api؟

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;
    }
}
}

هناك حل بديل آخر يبدو أكثر جاذبية.

  1. قم بإعداد خادم بحث - يمكن أن يكون أي جهاز/خادم يعمل بنظام Windows
  2. أعد ال خدمة إشعارات TFS*(Bissubscribe) للحصول على ، حذف ، تحديث الملفات في كل مرة يحدث فحص.لذلك هذه هي خدمة ويب تعمل مثل المستمع على خادم TFS ، وتحديث/مزامنة الملفات والمجلدات على خادم البحث.- سيؤدي هذا إلى تحسين الدقة بشكل كبير (البحث المباشر)، وتجنب التحميل لمرة واحدة لإجراء عمليات البحث الدورية
  3. قم بإعداد البحث المفهرس خدمة فهرسة/Windows على خادم البحث عن المجلد الجذر
  4. فضح خدمة الويب لإرجاع نتائج البحث

الآن مع كل الإعدادات المذكورة أعلاه، لديك بعض الخيارات للعميل:

  1. قم بإعداد صفحة ويب للاتصال بخدمة البحث وتنسيق النتائج لتظهر على صفحة الويب - يمكنك أيضًا دمج صفحة الويب هذه داخل الاستوديو المرئي (من خلال ماكرو أو وظيفة إضافية)
  2. قم بإنشاء واجهة عميل Windows (winforms/wpf) للاتصال بخدمة البحث وتنسيق النتائج وعرضها على واجهة المستخدم - يمكنك أيضًا دمج أداة العميل هذه داخل الاستوديو المرئي عبر VSPackages أو الوظيفة الإضافية

تحديث:لقد سلكت هذا الطريق، وكان يعمل بشكل جيد.أردت فقط أن أضيف إلى هذا.

الروابط المرجعية:

  1. استخدم هذه الأداة بدلاً من bissubscribe.exe
  2. التعامل مع أحداث TFS
  3. إشعارات نظام الفريق

إذا قمت بتثبيت TFS 2008 PowerTools، فستحصل على إجراء "البحث في التحكم بالمصدر" في قائمة النقر بزر الماوس الأيمن في Team Explorer.

أدوات كهربائية TFS2008

لقد قمنا بإعداد حل للتحكم في مصدر خادم Team Foundation (وليس SourceSafe كما ذكرت) مشابهًا لما يقترحه Grant؛من المقرر الحصول على TF، بحث خادم اكسبرس.ومع ذلك، فإن IFilter المستخدم لملفات C# (نصية) لم يكن يعطي النتائج التي أردناها، لذلك نقوم بتحويل الملفات المصدر إلى ملفات .htm.يمكننا الآن إضافة بيانات تعريفية إضافية إلى الملفات مثل:

  • المؤلف (نحن نعرّفه بأنه الشخص الذي قام بإيداع الملف آخر مرة)
  • ترميز الألوان (في قائمة المهام لدينا)
  • عدد التغييرات التي تشير إلى مشاكل التصميم المحتملة (في قائمة المهام لدينا)
  • التكامل مع VSTS IDE مثل ميزة Koders SmartSearch
  • إلخ.

ومع ذلك، فإننا نفضل معالج بروتوكول للتحكم في مصدر TFS، وكود مصدر مخصص IFilter للحصول على حل أكثر استهدافًا.

تمام،

  1. أدوات الطاقة TFS2008 تفعل ذلك لا لديك وظيفة البحث في الملفات."توفر أدوات البحث في التحكم بالمصدر القدرة على تحديد موقع الملفات والمجلدات في التحكم بالمصدر من خلال العنصر حالة أو مع أ حرف البدل تعبير."

  2. يوجد برنامج Windows مع هذه الوظيفة المنشورة عليه كودبلكس.لقد قمت للتو بتثبيت هذا واختباره وهو يعمل بشكل جيد.

أصبح هذا ممكنًا الآن اعتبارًا من TFS 2015 باستخدام Code Search توصيل في. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search

يتم البحث عبر واجهة الويب، ولا يتطلب منك تنزيل الكود على جهازك المحلي وهو أمر رائع.

الحل الآخر هو استخدام "ctrl+shift+F".يمكنك تغيير موقع البحث إلى دليل محلي بدلاً من الحل أو المشروع.سيحل هذا محل البحث على سطح المكتب وستظل بحاجة إلى الحصول على أحدث التعليمات البرمجية، ولكنه سيسمح لك بالبقاء داخل Visual Studio لإجراء البحث.

تدعي هذه الوظيفة الإضافية أنها تتمتع بالوظيفة التي أعتقد أنك تبحث عنها:

فريق مؤسسة الصاحب

يشرح هذا البحث عن رابط ملف كيفية العثور على ملف. لقد اضطررت إلى التلاعب بالنصيحة لإنجاحها.

  1. قرص مضغوط "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
  2. tf دير "$/*.sql" / عودي / الخادم:http://mytfsserver:8080/tfs

في حالة الأمر cd، قمت بتنفيذ الأمر cd لأنني كنت أبحث عن ملف tf.exe.كان من الأسهل أن نبدأ من آيات الدليل بإضافة المسار بأكمله.الآن بعد أن فهمت كيفية تنفيذ هذا الأمر، سأستخدم المسار المطلق بين علامتي الاقتباس.

في حالة البحث عن tf، بدأت من جذر الخادم باستخدام $/ وبحثت عن جميع الملفات التي انتهت بـ sql أي. *.sql.إذا كنت لا تريد البدء من الجذر، فاستخدمه "$/myproject/*.sql" بدلاً من.

أوه!هذا لا يحل البحث في جزء الملف من السؤال ولكن بحث Google الخاص بي أوصلني إلى هنا للعثور على الملفات من بين الروابط الأخرى.

على افتراض أن لديك المفكرة ++, ، الميزة التي غالبًا ما يتم تفويتها هي "البحث في الملفات"، وهي سريعة للغاية وتأتي مع عوامل التصفية والتعبيرات العادية والاستبدال وجميع ميزات N++ الجيدة.

لا توجد حاليًا طريقة للقيام بذلك خارج الصندوق، ولكن هناك اقتراح صوت المستخدم لإضافته: http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2037649-implement-indexed-full-text-search-of-work-items

على الرغم من أنني أشك في أن الأمر بسيط مثل الضغط على المفتاح، إذا قام كل من شاهد هذا السؤال بالتصويت له، فمن المحتمل أن يقوم MS بتنفيذ شيء ما.

تحديث:فقط اقرأ مدونة بريان هاري, ، والذي يُظهر أن هذا الطلب موجود على رادارهم، والإصدار عبر الإنترنت من Visual Studio لديه دعم محدود للبحث عن مكان استخدام git باعتباره vcs: http://blogs.msdn.com/b/visualstudioalm/archive/2015/02/13/anouncen-limited-preview-for-visual-studio-online-code-search.aspx.ومن هنا أعتقد أنه من العدل أن نقول إنها مسألة وقت فقط..

التحديث 2: يوجد الآن ملحق توفره Microsoft،البحث عن الكود والتي تمكن من البحث في التعليمات البرمجية وكذلك في عناصر العمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top