自定义MsBuild任务:哪个解决方案/其他项目参与构建?

时间:2013-05-11 10:45:36

标签: c# .net msbuild

是否可以从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文件中。

有没有办法实现这个目标?

1 个答案:

答案 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());
    }