有没有办法强制MsBuild以类似makedepend的结构化形式输出目标依赖关系信息?我需要在解决方案级别为包含C#和C ++项目的解决方案。我对输出格式并不挑剔。
我认为可以通过处理.csproj文件和构建DAG来确定C#依赖项。同样,我可以在C ++源代码上运行开源makedepend
并从那里开始。我真的不想在这里推出自己的东西 - 这似乎是MsBuild应该能做的事情,即使是用于诊断目的。
答案 0 :(得分: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#的一种非常可靠的方法 - 它包括引用的程序集,嵌入的资源和内容。