如何在 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
我们有大约 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