Поиск в Файлах:Выполните поиск по всему коду в Team Foundation Server
-
09-06-2019 - |
Вопрос
Есть ли способ выполнить поиск в последней версии каждого файла в TFS по определенной строке или регулярному выражению?Это, наверное, единственное, чего мне не хватает в Visual Source Safe...
В настоящее время я выполняю получение последней версии для всей кодовой базы и использую Windows Search, но это становится довольно болезненным из-за более чем 1 ГБ кода в 75 000 файлах.
Редактировать:Попробовал упомянутые powertools, но опция "Поиск по шаблону", похоже, предназначена только для поиска имен файлов, а не содержимого.
Обновить:Мы внедрили настраиваемую опцию поиска в существующую установку MOSS (поискового сервера).
Решение
Team Foundation Server 2015 (локальная версия) и Visual Studio Team Services (облачная версия) включают встроенную поддержку поиска по всему коду и рабочим элементам.
Вы можете выполнять простой поиск строк, например, foo
, логические операции, такие как foo OR bar
, или более сложные вещи, специфичные для языка, такие как class: WebRequest
р>
Подробнее об этом можно прочитать здесь: https: //www.visualstudio .com / EN-US / документы / поиск / обзор
Другие советы
В моем случае написание небольшой утилиты на C # помогло. Ссылки, которые мне помогли - http: //pascallaurin42.blogspot. ком / 2012/05 / TFS-запросы-поиск-в-все-файлов-of.html
Как вывести список файлов команды проект с использованием 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;
}
}
}
Есть еще одно альтернативное решение, которое кажется более привлекательным.
- Настройка поискового сервера - это может быть любой компьютер / сервер с Windows
- Настройка a Служба уведомлений TFS* (Bissubscribe) для получения, удаления, обновления файлов каждый раз, когда происходит проверка .Итак, это веб-служба, которая действует как прослушиватель на сервере TFS и обновляет / синхронизирует файлы и папки на сервере поиска.- это значительно повысит точность (поиск в реальном времени) и позволит избежать одноразовой загрузки при выполнении периодических запросов
- Настройка службы индексирования /Windows индексированный поиск на сервере поиска для корневой папки
- Предоставьте веб-сервис для возврата результатов поиска
Теперь, после всех вышеперечисленных настроек, у вас есть несколько вариантов для клиента:
- Настройте веб-страницу для вызова службы поиска и форматирования результатов для отображения на веб-странице - вы также можете интегрировать эту веб-страницу в Visual Studio (с помощью макроса или надстройки)
- Создайте клиентский интерфейс Windows (winforms / wpf) для вызова службы поиска, форматирования результатов и отображения их в пользовательском интерфейсе - вы также можете интегрировать этот клиентский инструмент в Visual Studio через VSPackages или надстройку
Обновить:Я действительно пошел по этому пути, и он прекрасно работает.Просто хотел кое-что добавить к этому.
Справочные ссылки:
Если вы установите TFS 2008 PowerTools, вы получите " Поиск в Source Control " действие в меню Team Explorer правой кнопкой мыши.
Мы создали решение для Team Foundation Server Source Control (не SourceSafe, как вы упомянули), аналогичное тому, что предлагает Грант;запланированный TF Get, Поисковый сервер Express.Однако IFilter, используемый для файлов C # (text), не давал желаемых результатов, поэтому мы конвертируем исходные файлы в htm-файлы.Теперь мы можем добавить дополнительные метаданные в файлы, такие как:
- Автор (мы определяем его как лицо, которое в последний раз проверялось в файле)
- Цветовое кодирование (в нашем списке задач)
- Количество изменений, указывающих на потенциальные проблемы с дизайном (в нашем списке задач)
- Интеграция с интегрированной средой разработки VSTS, такой как функция SmartSearch от Koders
- и т.д.
Однако мы бы предпочли protocolhandler для управления версиями TFS и специальный IFilter исходного кода для гораздо более целевого решения.
Ладно,
Электроинструменты TFS2008 делают нет есть функция поиска в файлах."Инструменты поиска в системе управления версиями предоставляют возможность находить файлы и папки в системе управления версиями по элементу Статус или с помощью подстановочный знак выражение лица."
Существует программа для Windows с такой функциональностью, размещенная на CodePlex ( Кодовый комплекс ).Я только что установил и протестировал это, и оно работает хорошо.
Это стало возможным начиная с TFS 2015 с помощью плагина Поиск выполняется через веб-интерфейс и не требует загрузки кода на локальный компьютер, что приятно. Code Search
. https://marketplace.visualstudio.com/items?itemName=ms.vss-code-search а> р>
Другое решение заключается в использовании " ctrl + shift + F " ;. Вы можете изменить местоположение поиска на локальный каталог, а не на решение или проект. Это займет место поиска на рабочем столе, и вам все равно потребуется получить последний код, но это позволит вам оставаться в Visual Studio для выполнения поиска.
Эта надстройка утверждает, что обладает функциональностью, которую, я полагаю, вы ищете:
В этом разделе поиска ссылки на файл объясняется, как найти файл. Мне действительно пришлось повозиться с советами, чтобы все сработало.
- компакт-диск "C:\Program Файлы (x86)\Microsoft Visual Studio 12.0\Common7\IDE"
- tf dir "$/*.sql" /рекурсивный /сервер:http://mytfsserver:8080/tfs
В случае с командой cd я выполнил команду cd, потому что искал файл tf.exe.Было проще просто начать с этого каталога, не добавляя весь путь целиком.Теперь, когда я понимаю, как заставить это работать, я бы использовал абсолютный путь в кавычках.
В случае поиска tf я начал с корневого каталога сервера с помощью $/
и я искал все файлы, которые заканчивались на sql
т. е. *.sql
.Если вы не хотите начинать с корня, то используйте "$/myproject/*.sql"
вместо этого.
О!Это не решает проблему поиска в файловой части вопроса, но мой поиск в Google привел меня сюда, чтобы найти файлы среди других ссылок.
Если у вас есть Notepad ++ , часто пропускаемая функция - это «Поиск в файлах», которая очень быстро и поставляется с фильтрами, регулярными выражениями, заменой и всеми вкусностями 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/announcing-limited-preview-for-visual-studio-online-code-search.aspx . Исходя из этого, я думаю, что будет справедливо сказать, что это всего лишь вопрос времени ...
Обновление 2: . Теперь есть расширение, предоставленное Microsoft, Поиск кода , который позволяет выполнять поиск по коду, а также по рабочим элементам.