MSBUILD:如何解析解决方案文件以获取项目路径

Jac*_*eja 1 msbuild

使用 MSBUILD 时如何从解决方案中获取项目文件列表?

例如从 .sln 获取所有 .csproj。

Jac*_*eja 5

我以前为此使用过MSBuild Community Tasks GetSolutionProjects,但不幸的是它依赖于 .NET 3.5。

要使用 a CodeTask(自 .NET 4 起可用)完成此操作,请执行以下操作:

  <UsingTask TaskName="GetProjectsFromSolutionCodeTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll" >
    <ParameterGroup>
      <Solution ParameterType="System.String" Required="true"/>
      <Output ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/>
    </ParameterGroup>
    <Task>
      <Reference Include="System.Xml"/>
      <Reference Include="Microsoft.Build"/>
      <Using Namespace="Microsoft.Build.Construction"/>
      <Code Type="Fragment" Language="cs">
        <![CDATA[
        var _solutionFile = SolutionFile.Parse(Solution); 
        Output = _solutionFile.ProjectsInOrder
            .Where(proj => proj.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat)
            .Select(proj => new TaskItem(proj.AbsolutePath))
            .ToArray();
      ]]>
      </Code>
    </Task>
  </UsingTask>
Run Code Online (Sandbox Code Playgroud)

并像这样调用它:

  <!-- Gets the projects composing the specified solution -->
  <Target Name="GetProjectsFromSolution">
    <GetProjectsFromSolutionCodeTask Solution="%(Solution.Fullpath)">
      <Output ItemName="ProjectFiles" TaskParameter="Output"/>
    </GetProjectsFromSolutionCodeTask >
  </Target>
Run Code Online (Sandbox Code Playgroud)

这将ProjectFiles使用解决方案中所有项目的绝对路径填充项目集合。

请注意:路径CodeTaskFactory因 MSBuild 版本而异。此处的示例适用于 MSBuild 14.0。