2011-04-11 4 views
0

저는 소스 제어에서 다양한 프로젝트 간의 관계를 분석하는 작업을 최근 수행해 왔습니다. 지금까지 Select-Xml cmdlet을 통해 PowerShell과 XPath를 사용하여 csproj 파일을 처리했지만 MSBuild가 ProjectReference 및 Reference 요소를 프로젝트 파일에서 사용하는 방법에 대한 필자의 지식이 부족합니다. MSBuild 자체를 사용하여 참조를 확인하고 참조 해결 프로세스의 결과를 검사 할 수 있다면 훨씬 더 나을 것입니다.msbuild 참조 해상도

MSBuild 전문가 : 가능합니까? 이것이 커스텀 타겟 파일 또는 무엇인가를 작성해야 하는가? csproj 파일도 Microsoft.CSharp.targets를 가져 오기 때문에 프로젝트를 빌드해야합니다.

모든 통찰력이 좋을 것입니다. 감사!

+0

Ms 빌드 커뮤니티 작업을 조사해야합니다. 나는 그들이 정말로 도움이되는 것을 알았다. – reggie

답변

1

정말 쉽습니다. 먼저 다음 어셈블리를 참조하십시오.

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; 
} 
+0

사실 XPath로 HintPath 요소를 선택하고 비슷한 검사 (System.IO.Path.IsPathRooted!))를 사용하여이 똑같은 작업을 수행하고 있지만 동일한 복잡한 빌드를 활용하는 솔루션을 찾고 싶습니다. 참조 된 어셈블리를 찾을 때 MSBuild에서 사용하는 논리입니다. 이것의 외모에서, 이것은 HintPath 요소에 포함 된 문자열을 분석하는 것입니다. 맞습니까? – bwerks

+0

이 특정 예에서 네, 그냥 문자열을 확인합니다. 그러나 XPath로 쉽게 수행 할 수없는 작업에서 수행 할 수있는 다른 종류의 유효성 검사가 있습니다. 코드에서 평가되지 않은 "Include"문자열뿐만 아니라 평가 된 값과 모든 가져 오기를 포함한 전체 프로젝트 객체 모델에 액세스 할 수 있습니다. 유효성 분석을 얼마나 깊이 수행해야하는지에 달려 있습니다. –