我们有大约70个项目的解决方案。其中之一花费相对较长的时间(约10分钟),但不占用系统资源。我们还采用并行构建来加快处理速度。
当我(重新)将此项目添加到解决方案中时,它位于构建顺序的末尾。当compilong 69投影时,机器100%忙,然后在编译70th时10分钟空闲。当我手动编辑.sln文件以使该项目在所有列表中排在第一位时,它位于中间位置。如何将其移至开头?
这不是关于依赖项的不是。这个项目A只有一个到另一个项目B,如果B是第一个,而A是第二个,我很好。另外,没有其他项目依赖于项目A。
答案 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