0

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

有没有办法做到这一点?

4

1 回答 1

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());
    }
于 2013-05-13T22:29:51.193 回答