0

私は最近、ソース管理におけるさまざまなプロジェクト間の関係を分析する作業を行っています。これまでのところ、Select-Xml コマンドレットを介して 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 に答える