msbuild эталонное разрешение - PullRequest
0 голосов
/ 11 апреля 2011

В последнее время я выполняю какую-то работу, которая анализирует отношения между различными проектами в системе контроля версий. До сих пор я использовал PowerShell и XPath с помощью командлета Select-Xml для обработки наших файлов csproj, однако это зависит от моих слабых знаний о том, как MSBuild использует элементы ProjectReference и Reference в файлах проекта. До меня дошло, что было бы намного лучше, если бы я мог использовать сам MSBuild для разрешения ссылок, а затем каким-то образом проверить результаты процесса разрешения ссылок.

Эксперты MSBuild: кажется ли это возможным? Это повлечет за собой написание файла пользовательских целей или что-то? Буду ли я вынужден также создавать проекты, так как файлы csproj также импортируют Microsoft.CSharp.targets?

Любое понимание было бы хорошо. Спасибо!

1 Ответ

2 голосов
/ 11 апреля 2011

Это действительно довольно легко. Сначала укажите эти сборки:

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;
}
...