Построить дерево зависимостей из файлов csproj - PullRequest
3 голосов
/ 10 декабря 2008

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

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

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 10 декабря 2008

Вы пробовали .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"];
 } 

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

2 голосов
/ 10 декабря 2008

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

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

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

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

1 голос
/ 10 декабря 2008

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

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

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

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

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

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

0 голосов
/ 10 декабря 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...