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

时间:2018-09-26 15:57:51

标签: visual-studio msbuild solution

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

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

这不是关于依赖项的不是。这个项目A只有一个到另一个项目B,如果B是第一个,而A是第二个,我很好。另外,没有其他项目依赖于项目A。

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

  

如何将其移至开头?

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

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

在这种情况下,我们只需要在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了解更多详细信息。

希望这会有所帮助。

答案 2 :(得分:0)

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标志很重要。例如。

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

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

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