msbuild引用解析
我最近一直在做一些工作,分析源代码管理中各种项目之间的关系。到目前为止,我一直在通过Select Xml cmdlet使用PowerShell和XPath来处理我们的csproj文件,但这依赖于我对MSBuild如何使用项目文件中的ProjectReference和Reference元素所知甚少。我突然意识到,如果我可以使用MSBuild本身来解析引用,然后以某种方式检查引用解析过程的结果,那就更好了 MSBuild专家:这看起来可能吗?这是否需要编写一个自定义目标文件或其他东西?既然csproj文件也导入了Microsoft.CSharp.targets,我还会被迫构建项目吗msbuild引用解析,msbuild,dependencies,csproj,targets,build-dependencies,Msbuild,Dependencies,Csproj,Targets,Build Dependencies,我最近一直在做一些工作,分析源代码管理中各种项目之间的关系。到目前为止,我一直在通过Select Xml cmdlet使用PowerShell和XPath来处理我们的csproj文件,但这依赖于我对MSBuild如何使用项目文件中的ProjectReference和Reference元素所知甚少。我突然意识到,如果我可以使用MSBuild本身来解析引用,然后以某种方式检查引用解析过程的结果,那就更好了 MSBuild专家:这看起来可能吗?这是否需要编写一个自定义目标文件或其他东西?既然cspro
任何洞察都很好。谢谢 这真的很容易。首先参考这些组件:
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;
}
您应该研究Ms Build社区任务。我发现它们真的很有用。实际上,我只是通过使用XPath选择HintPath元素并进行类似的检查(以及System.IO.Path.IsPathRooted!;)来做同样的事情,但我希望找到一个解决方案,利用MSBuild在查找引用程序集时使用的相同复杂构建逻辑。从外观上看,这只是分析HintPath元素中包含的字符串,对吗?在这个特定示例中,是的,它只是检查字符串。但是,您可以在XPath无法轻松完成的任务中执行其他类型的验证。在代码中,您不仅可以访问未计算的“Include”字符串,还可以访问已计算的值,以及包括任何导入在内的整个项目对象模型。这取决于验证分析的深度。