我最近一直在做一些分析不同项目在源代码控制中的关系的工作。到目前为止,我一直在使用PowerShell和XPath通过Select-Xml cmdlet来处理我们的csproj文件,但是这依赖于我对MSBuild如何在项目文件中使用ProjectReference和Reference元素的微弱知识。我突然意识到,如果我可以使用MSBuild本身来解析引用,然后以某种方式检查引用解析过程的结果,那将会更好。
MSBuild专家:这看起来可能吗?这是否需要编写自定义目标文件或其他内容?我会被迫也建设项目,以及因为csproj文件也导入微软。csharp .目标?
任何见解都会很好。谢谢!
这真的很简单。首先引用这些程序集:
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;
}