是否可以从MsBuild自定义任务中判断出正在构建项目的解决方案,或者哪些其他项目也参与构建?
编辑:
尝试澄清一下背景。
假设我有以下设置:
Company
+- LibA
+- LibA.csproj
+- LibB
+- LibB.csproj
+- App1
+- App1.sln : App1.csproj, LibA.csproj, LibB.csproj
+- App1.csproj
+- App2
+- App2.sln : App2.csproj, LibA.csproj
+- App2.csproj
因此,您可以看到App1和App2都使用LibA并将其包含在解决方案中。但是,LibB只存在于一个解决方案中。
现在让我们假设LibA和LibB之间存在某种关系,并且这种关系是通过LibA / LibA.csproj中的自定义MsBuild任务来处理的。但是,要执行此操作,自定义任务需要知道LibB是否参与当前构建,或者是否存在于当前解决方案中。请记住,它与两种解决方案中使用的csproj文件相同。
我不介意自动执行此操作或将元数据添加到.sln文件中。
有没有办法实现这个目标?
答案 0 :(得分:1)
你可以解析csprojs的.sln(因为它不是xml更难),但你可以解析csproj的引用和依赖。
以下是一些示例代码(可能会进入您的自定义任务。
string fileName = @"C:\MyFolder\MyProjectFile.csproj";
XDocument xDoc = XDocument.Load(fileName);
XNamespace ns = XNamespace.Get("http://schemas.microsoft.com/developer/msbuild/2003");
//References "By DLL (file)"
var list1 = from list in xDoc.Descendants(ns + "ItemGroup")
from item in list.Elements(ns + "Reference")
/* where item.Element(ns + "HintPath") != null */
select new
{
CsProjFileName = fileName,
ReferenceInclude = item.Attribute("Include").Value,
RefType = (item.Element(ns + "HintPath") == null) ? "CompiledDLLInGac" : "CompiledDLL",
HintPath = (item.Element(ns + "HintPath") == null) ? string.Empty : item.Element(ns + "HintPath").Value
};
foreach (var v in list1)
{
Console.WriteLine(v.ToString());
}
//References "By Project"
var list2 = from list in xDoc.Descendants(ns + "ItemGroup")
from item in list.Elements(ns + "ProjectReference")
where
item.Element(ns + "Project") != null
select new
{
CsProjFileName = fileName,
ReferenceInclude = item.Attribute("Include").Value,
RefType = "ProjectReference",
ProjectGuid = item.Element(ns + "Project").Value
};
foreach (var v in list2)
{
Console.WriteLine(v.ToString());
}