如何在 VisualStudio 解决方案中确定项目的优先级?

How to prioritize a project in a VisualStudio-solution?

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

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

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

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

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

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

How can I move it to the beginning?

您可以在与解决方案相同的文件夹中创建名为“before.<SolutionName>.sln.targets”的 MSBuild 项目文件。

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

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

before.<SolutionName>.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 了解更多详情。

希望这对您有所帮助。

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

为了获得更大的灵活性,我添加了一个 msbuild 脚本 (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 调用 long-运行 任务,设置此任务的 YieldDuringToolExecution-flag 很重要。例如。

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

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

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