Построить дерево зависимостей из файлов csproj

В настоящее время я использую msbuild для решения более 600 проектов.

Представьте, что я изменяю код для 1 библиотеки, которая используется 10 проектами. Вместо того, чтобы предоставить все 600 проектов для msbuild и позволить ему скомпилировать их все и выяснить зависимости. Мне было интересно, есть ли программа или библиотека, которую я мог бы использовать, чтобы проанализировать зависимости всех 600 проектов и позволить мне скомпилировать только те 11, которые необходимы.

Другими словами, учитывая ввод всех 600 проектов для сканирования и BaseLibrary.csproj как проект, который был изменен в параметре, предоставьте мне только 11 проектов, которые мне нужно скомпилировать в качестве вывода.

У меня есть опыт написания пользовательских задач, я бы лучше использовал стороннюю библиотеку для анализа зависимостей, если она уже есть.

Моя компания делает дополнительные выпуски в производство каждые 3-4 месяца. В качестве эксперимента я написал пользовательское задание, которое просматривает предыдущие теги Subversion и оценивает все скомпилированные файлы, которые были изменены с тех пор, и сопоставляет их с проектом.

Единственный вариант использования, о котором я могу подумать, что он не работает, это тот, который я упомянул, когда базовая библиотека изменена, и система не знает обо всех проектах, которые зависят от нее.

10.12.2008 14:51:54
4 ОТВЕТА
РЕШЕНИЕ

Вы пробовали .NET анализатор зависимостей сборки ?

Это открытый исходный код, и вывод графика в точечный скрипт может быть тем, что вам нужно. Пример с сайта:

digraph G { 
      size="100,69"
      center=""
      ratio=All
      node[width=.25,hight=.375,fontsize=12,color=lightblue2,style=filled]
      1 -> 9;
      1 -> 11;
      9 -> 10;
      11 -> 10;
      1 [label="Drew.Controls.Map"];
      9 [label="Drew.Types"];
      10 [label="nunit.framework"];
      11 [label="Drew.Util"];
 } 

Со списком проектов и выводом этого скрипта вы можете создать свой список компиляции.

5
10.12.2008 15:41:42
К сожалению, этот инструмент, похоже, не работает с никогда (т.е.> = VS2010) проектами и решениями. Доступен ли подобный инструмент?
EluciusFTW 8.04.2014 13:47:44
просто комментарий: вам нужно запустить инструмент от имени администратора, и он работал с моим решением VS2008
Kat Lim Ruiz 14.07.2014 19:18:34

Задачи MSBuild не имеют то, что вы ищете, но это даст вам легкую точку входа для написания ваших собственных задач.

0
10.12.2008 14:57:40

Зависимости проекта - это график, где проект P имеет направленное ребро к проекту Q, если P зависит от Q. Это означает, что Q должен быть построен до P.

В общем, топологический вид графа показывает порядок зависимостей всего графа, но вас интересует только граф от P до корня графа (или корней, если их больше).

Корнем на этом графике является проект, который не зависит ни от какого другого проекта, но другие проекты зависят от этого проекта.

Когда вы меняете P, все проекты из P в корневую (ые) систему, с которой вы работаете, должны быть скомпилированы в обратном порядке (сначала root). Самый простой способ сделать это - создать подграф этого пути (с подузлами) и использовать топологическую сортировку, чтобы определить правильный порядок.

Тем не менее, это сложная проблема, так как изменение кода в проекте должно пометить этот проект как «измененный» каким-либо образом, а также вы должны вручную проанализировать файлы проекта на наличие зависимостей.

Если я не ошибаюсь, MSBuild компилирует только те проекты, которые устарели. (хотя и обрабатывает их, но должен, иначе он не может определить, какой проект «изменен»).

1
10.12.2008 15:03:52

У меня есть код, который делает именно это; Я использую его в нашем специальном процессе сборки, чтобы: выяснить порядок сборки (без необходимости поддерживать его), и b: каскад меняется вверх через дерево случайных проектов. К сожалению, в данный момент я не нахожусь в моем обычном офисе, и код слишком сложен, чтобы воспроизводить его «без надобности» (он выполняет много графических отображений и отслеживание зависимостей).

Я должен добавить, что в настоящее время он работает, имея собственный маркер (файл XML) в корне каждого проекта, который отслеживает, что нужно построить; наш процесс продвижения кода устанавливает флаг, а процесс сборки очищает его.

В настоящий момент он работает так, что вы попадаете в корень, содержащий все проекты (на любой глубине), и просто набираете depends(с несколькими переключателями), и он генерирует все пути к проектам, которые нужно построить, в правильном порядке.

Дайте мне знать, если это интересно ...

2
10.12.2008 15:57:33
Привет Марк, мне интересно, особенно если это работает с ядром dotnet
Dai Bok 4.02.2019 14:40:42
@DaiBok, к сожалению, я, вероятно, потерял этот код за прошедшее десятилетие ... но инструменты сборки в наши дни настолько лучше, что, честно говоря, вам это не нужно - ваши сборки уже должны правильно определять порядок
Marc Gravell♦ 4.02.2019 15:05:24
Я "взломал" небольшой анализатор файлов csproj и отправил данные в библиотеку автоматического построения графиков Microsoft для создания подробного графика. Если кто-то хочет знать больше, свяжитесь с нами.
Dai Bok 5.02.2019 10:33:36