Может ли MSBuild выводить информацию о зависимостях, аналогичную makedepend?

#msbuild #dependencies

#msbuild #зависимости

Вопрос:

Есть ли способ заставить MSBuild выводить целевую информацию о зависимостях в структурированной форме, аналогичной makedepend? Мне это нужно на уровне решения для решения, содержащего проекты на C # и C . Я не придирчив к формату вывода.

Я считал, что зависимости C # могут быть определены путем обработки файлов .csproj и создания базы данных. Аналогично, я мог бы запустить open-source makedepend на исходниках C и перейти оттуда. Я действительно стараюсь не использовать здесь свои собственные — это похоже на то, что MSBuild должен уметь просто делать, хотя бы для диагностических целей.

Ответ №1:

Я решил это без особых усилий. Очевидно, что MSBuild имеет информацию о зависимостях во время сборки, поэтому мой подход заключается в том, чтобы обернуть сборку пользовательской целью, которая записывает зависимость в файл .depends:

 <?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <!-- Write project dependencies to a .depends file, one line per dependency -->
  <Target Name="OutputProjectDependencies">
    <Delete Files="$(OutputPath)$(TargetFileName).depends"/>
    <WriteLinesToFile File="$(OutputPath)$(TargetFileName).depends" 
      Lines="@(CscDependencies->'%(FullPath)');@(ReferencePath->'%(FullPath)');@(Content->'%(FullPath)');@(_NoneWithTargetPath->'%(FullPath)')"
      Overwrite="false"
      Encoding="UTF-8"/>
    <WriteLinesToFile File="$(OutputPath)$(TargetFileName).depends" 
      Lines="@(ClDependencies->'%(FullPath)')"
      Overwrite="false"
      Encoding="UTF-8"/>
  </Target>

  <ItemGroup>
    <CscDependencies Include="@(Compile);@(EmbeddedResource)"/>
    <ClDependencies Include="@(ClCompile);@(ClInclude)"/>
  </ItemGroup>

  <PropertyGroup>
    <BuildDependsOn>
      $(BuildDependsOn);
      OutputProjectDependencies;
    </BuildDependsOn>
  </PropertyGroup>

</Project>
  

Это не так надежно, как хотелось бы для проектов на C (в нем отсутствуют включенные зависимости от заголовков и библиотек ссылок), но, вероятно, может быть дополнительно улучшено. Я считаю, что это очень надежный подход для C # — он включает сборки, на которые ссылаются, встроенные ресурсы и контент.