构建时 Visual Studio 中输出窗格左栏中数字的含义

Eri*_*ric 10 build visual-studio visual-studio-2015

多年来我一直想知道在进行构建时 Visual Studio 中输出窗格左列中的数字的含义是什么。通常随着解决方案中每个项目的构建而增加,但它们也会跳跃。例如:

1>------ Rebuild All started: Project: MyCompany.MyProject1, Configuration: Debug Any CPU ------
2>------ Rebuild All started: Project: MyCompany.MyProject2, Configuration: Debug Any CPU ------
3>------ Rebuild All started: Project: MyCompany.MyProject3, Configuration: Debug Any CPU ------
4>------ Rebuild All started: Project: MyCompany.MyProject4, Configuration: Debug Any CPU ------
4>C:\SourcePath\MyApplication\MyNamespace\Views\MyFeature\MyCompany.MyProject2.csproj(172,3): warning MSB4011: "C:\MyPath1.CSharp.targets" cannot be imported again. It was already imported at "C:\MyPath2\MyCompany.Build.CustomAfterMicrosoftCSharpTargets.props (41,5)". This is most likely a build authoring error. This subsequent import will be ignored. 
4>  Restoring NuGet packages...
4>  To prevent NuGet from downloading packages during build, open the Visual Studio Options dialog, click on the Package Manager node and uncheck 'Allow NuGet to download missing packages'.
4>  Feeds used:
4>    C:\Users\MyUser\AppData\Local\NuGet\Cache
4>    C:\Users\MyUser\.nuget\packages\
4>    https://api.nuget.org/v3/index.json
4>    http://nuget.MyCompany.com/nuget/api/v2/
4>    C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
4>  
4>  All packages listed in MyPath5\packages.config are already installed.
4>  MyCompany.MyProject4 -> MyPath6\MyCompany.MyProject4.dll
5>------ Rebuild All started: Project: MyCompany.MyNamespace.This.Something, Configuration: Debug Any CPU ------
5>  MyCompany.MyNamespace.This.Something -> C:\SourcePath\MyApplication\MyNamespace\ThisLayer\Something\bin\Debug\MyCompany.MyNamespace.This.Something.dll
3>C:\SourcePath\MyApplication\MyNamespace\Views\MyFeature\MyCompany.MyProject2.csproj(172,3): warning MSB4011: "C:\MyPath1.CSharp.targets" cannot be imported again. It was already imported at "C:\MyPath2\MyCompany.Build.CustomAfterMicrosoftCSharpTargets.props (41,5)". This is most likely a build authoring error. This subsequent import will be ignored. 
3>  Restoring NuGet packages...
Run Code Online (Sandbox Code Playgroud)

hai*_*ndl 7

在构建开始时,Visual Studio 会为要构建的每个项目分配一个唯一的编号,直到达到我将在稍后解释的最大编号。在您的情况下,这些是您看到的前四行:X>------ Rebuild All started

现在 VS(及其配套的 MSBuild)尝试解决项目之间的依赖关系。然后,它将项目分组为必须依次构建的单元,因为它们相互依赖。但组本身之间没有任何依赖关系,因此可以并行编译而不会互相影响。

可以在 VS 下更改最大并行构建数Tools --> Options --> Project and Solutions --> Build and Run --> maximum number of parallel project builds。在我的例子中,默认值是 4 个并行构建,但据记录单个默认值是 CPU 核心的数量,它只影响 C# 和 C++ 项目,并且当前的最大数量是 32。(我不知道是否这意味着逻辑或物理核心,但逻辑核心对我来说最有意义。)

现在,输出窗口中每行开头的每个数字都属于已分配给该数字的项目的构建进度。

因此,在您的情况下MyCompany.MyProject4,首先构建(很可能是纯粹随机的),并且以 开头的所有行都4>属于该项目。当它完成时,VS 决定使用这个空闲插槽,并将另一个项目MyCompany.MyNamespace.This.Something放入构建过程中,并为其分配编号5>

它开始构建这个项目,但突然之间,带有MyCompany.MyProject3该编号的项目构建3>终于取得了一些进展并打印了其构建消息。

因此,数字的洗牌实际上是四个并行线程的结果,这些线程在发生时打印其输出。事实上,每个线程实际上都是 MSBuild.exe 的一个单独进程,您可以在 Windows 任务管理器中看到它。

如果您的所有项目都恰好具有另一个项目依赖项(并且每个项目仅被引用一次),那么如果您将它们构建在一起,您将永远不会看到并行构建,因为没有什么可以安全地同时完成。(你不能依赖尚未构建的东西。)

您可以在Visual Studio 文档MSBuild 文档中找到有关并行构建的更多详细信息。