【问题标题】:How to prioritize a project in a VisualStudio-solution?如何在 VisualStudio 解决方案中确定项目的优先级?
【发布时间】:2018-09-26 15:57:51
【问题描述】:

我们有一个包含大约 70 个项目的解决方案。其中一个需要相对较长的时间(约 10 分钟),但不使用系统资源。我们还采用并行构建来加快速度。

当我(重新)将此项目添加到解决方案时,它位于构建顺序的末尾。机器在编译 69 个项目时 100% 忙,然后在编译第 70 个项目时空闲 10 分钟。当我手动编辑 .sln 文件以使项目在所有列表中排在首位时,它位于中间的某个位置。我怎样才能把它移到开头?

不是关于依赖关系的。这个项目A只有一个到另一个项目B,如果B是第一个只要A是第二个,我就可以了。此外,没有其他项目依赖于项目 A。

【问题讨论】:

    标签: visual-studio msbuild solution


    【解决方案1】:

    听起来您已经尝试在 Visual Studio 中编辑项目依赖项。如果您已经对其进行了编辑以首先制作项目,但仍需要一段时间,那么您可能应该将其从解决方案文件中取出。然后将它的构建放入您自己的 msbuild 脚本中,您可以在其中使用 MSBuildExtensions 并行任务使其与其他所有内容同时构建:

    https://mikefourie.wordpress.com/2012/02/29/executing-msbuild-targets-in-parallel-part-1/

    我很确定 MSBuildExtensions 库现在也是一个 nuget 包。

    【讨论】:

    • 我之前研究过 MSBuildExtensions。它是功能性的,但会破坏日志输出(我们使用 msbuild 的二进制日志输出)。但它会解决最初的问题。为那个点赞……
    【解决方案2】:

    VisualStudios sln 文件非常有限,并且是以几十年前定义的格式编写的。事实上,在做任何有用的事情之前,它会被转换为 msbuild-script。

    为了获得更大的灵活性,我添加了一个 msbuild-script (master.msbuild),其中包含与此类似的内容(未经测试但正确的 documentation is available

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  
    <ItemGroup>  
        <ProjectsToBuild Include="longrunningproject.proj" /> 
        <ProjectToBuild 
            Include="SolutionWithTheOther69Projects.sln"
            Properties="Configuration=Debug;Platform=x86"/>         
    </ItemGroup>  
    
    <Target Name="Build" >  
        <MSBuild  
            Projects="@(ProjectsToBuild)"  
            Targets="Build"
            BuildInParallel="true"  
            ContinueOnError="false"
            Properties="VeloxVersion=$(VeloxVersion);RootDir=$(RootDir)"
        />  
    </Target>
    </Project>
    

    项目按照定义的顺序执行。仍然无法控制解决方案中发生的事情,但我可以将项目放在前面或后面,从而影响构建顺序。

    如果长时间运行的任务由 msbuild-exec-task 调用,设置此任务的YieldDuringToolExecution-flag 很重要。例如。

    <Exec 
            Command="..."
            YieldDuringToolExecution="true"
        />
    

    否则,事情会并行开始,然后慢慢消失,直到执行任务完成。我无法解读其背后的逻辑,但老实说,我不在乎。

    经过几天的尝试和错误,构建机器以 100%-cpu-load 尖叫,慢慢地回到一个长时间运行的任务然后完成。 加速因子 2.5 :D

    【讨论】:

      【解决方案3】:

      如何将它移到开头?

      您可以在解决方案所在的文件夹中创建一个名为“before.&lt;SolutionName&gt;.sln.targets”的 MSBuild 项目文件。

      然后使用命令行构建解决方案(Visual Studio 将忽略此文件。),before.&lt;SolutionName&gt;.sln.targets 将在解决方案中的所有 Visual Studio 项目之前构建。

      在这种情况下,我们只需要在before.&lt;SolutionName&gt;.sln.targets 文件中构建那个特殊项目,这个特殊项目将在解决方案中的所有项目之前构建。

      before.&lt;SolutionName&gt;.sln.targets的内容点赞:

      <?xml version="1.0" encoding="utf-8"?>
      
      <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Target Name="BuildSpecialProject" BeforeTargets="Build">
          <Message Text="Build My Specify Project" />
      
          <MSBuild Projects="Path\YouSpecialName.csproj"/>
      </Target>
      
      </Project>
      

      然后通过命令行使用 MSBuild 或 dotnet 构建解决方案文件:

      msbuild /t:build "<SolutionPath>\<SolutionName>.sln"
      
      dotnet build "<SolutionPath>\<SolutionName>.sln"
      

      查看this thread了解更多详情。

      希望这会有所帮助。

      【讨论】:

      • 然后系统空闲 10 分钟,同时“编译”第一个项目,然后忙于编译其他 69 个项目。
      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2014-04-17
      • 2017-11-16
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多