0

我最近一直在做一些工作,分析源代码控制中各个项目之间的关系。到目前为止,我一直通过 Select-Xml cmdlet 使用 PowerShell 和 XPath 来处理我们的 csproj 文件,但这依赖于我对 MSBuild 如何使用项目文件中的 ProjectReference 和 Reference 元素的薄弱知识。我突然意识到,如果我可以使用 MSBuild 本身来解析引用,然后以某种方式检查引用解析过程的结果,那会好得多。

MSBuild 专家:这看起来可能吗?这是否需要编写自定义目标文件或其他内容?由于 csproj 文件也导入 Microsoft.CSharp.targets,我是否也会被迫构建项目?

任何见解都会很好。谢谢!

4

1 回答 1

2

这真的很容易。首先引用这些程序集:

Microsoft.Build
Microsoft.Build.Engine
Microsoft.Build.Framework
Microsoft.Build.Utilities.v4.0

...您可以围绕 MSBuild 对象模型创建一些工具。我有一个自定义 MSBuild 任务,可以在构建中直接进行此分析,片段如下:

private bool CheckReferences(string projectFullPath)
{
    var project = new Project(projectFullPath);

    var items = project.GetItems("Reference");
    if (items == null)
        return true;

    foreach (var item in items)
    {
        if (item == null)
            continue;

        if (string.IsNullOrWhiteSpace(item.UnevaluatedInclude))
            continue;
        if (!item.HasMetadata("HintPath"))
            continue;

        string include = item.UnevaluatedInclude;
        string hintPath = item.GetMetadata("HintPath").UnevaluatedValue;

        if (!string.IsNullOrWhiteSpace(hintPath))
            if (hintPath.Contains(@"C:\") || hintPath.Contains("C:/"))
                LogWarning("Absolute path Reference in project {0}", projectFullPath);
    }

    return true;
}
于 2011-04-11T18:29:16.587 回答