Msbuild ProjectReferences是如何工作的?

Msbuild ProjectReferences是如何工作的?,msbuild,build,resolveassemblyreference,Msbuild,Build,Resolveassemblyreference,我想分析和调整我们的建设希望节省几秒钟在这里和那里。我能够创建一个从ResolveAssemblyReferences派生的任务并使用它,但是我在理解以下内容时遇到了问题(来自Microsoft.Common.targets): 一些参数被传递,一些参数被返回,但实际工作发生在哪里?msdn上没有太多内容-我找到了Microsoft.Build.Tasks.ResolveProjectBase,但它没有多大用处。ResolveProjectReferences(至少是您指向的一个)是一个目标

我想分析和调整我们的建设希望节省几秒钟在这里和那里。我能够创建一个从ResolveAssemblyReferences派生的任务并使用它,但是我在理解以下内容时遇到了问题(来自Microsoft.Common.targets):


一些参数被传递,一些参数被返回,但实际工作发生在哪里?msdn上没有太多内容-我找到了Microsoft.Build.Tasks.ResolveProjectBase,但它没有多大用处。

ResolveProjectReferences(至少是您指向的一个)是一个目标,用于通过使用任务生成项目间引用来解析项目间引用。此任务需要生成一个项目文件,以及项目中应作为生成的一部分调用的一个或多个目标的名称(它还需要其他参数,但您现在可以忽略这些参数)

考虑以下目标:

<Target
  Name="Build"
  Returns="@(BuildOutput)">

  <ItemGroup>
    <BuildOutput Include="bin\Debug\Foo.exe" />
  </ItemGroup>
</Target>

如果您引用了一个包含此目标的项目,并且希望解析“Foo”目标的输出,那么您的项目中会有这样一个元素:

<ItemGroup>
  <ProjectReference Include="..\SomeProject\SomeProject.proj">
    <Targets>Build</Targets>
  </ProjectReference>
</ItemGroup>

建造
注意,如果“Build”是被引用项目的默认目标,那么可以完全禁用“Targets”元数据。还可以在目标元数据(以分号分隔的列表)中指定多个目标

因此,您的ResolveProjectReferences目标将出现并调用该任务,将其传递给“.\SomeProject\SomeProject.proj”,并要求它构建“构建”目标。现在,由于“构建”目标通过其Returns属性指定输出(但如果未指定Returns属性,则将使用outputs属性),因此这些输出将在构建过程中获取,并在任务的targetOutput参数处返回。它们添加了一些额外的元数据,使您能够通过原始目标将它们隔离。这些措施包括:

  • MSBuildSourceProjectFile—其生成生成输出的引用项目
  • MSBuildSourceTargetName—其生成生成输出的目标的名称

如果你在一个C#项目中工作,参考解析还有很多其他阶段(包括汇编解析)。如果你想知道这些,给我写信

因此,如果结果表明ResolveProjectReferences阶段在构建过程中花费了大量时间,这实际上是因为项目被阻塞、等待或依赖项被构建?我还没有找到任何关于这个的清晰文档。不清楚这是花在识别和定位依赖项上的时间(实际工作),还是花在等待依赖项可用上的时间(实际上是空闲时间)。您最好的选择是在诊断详细级别上构建。这将准确地显示每个目标正在做什么(包括嵌套构建)以及许多操作的时间安排。
<ItemGroup>
  <ProjectReference Include="..\SomeProject\SomeProject.proj">
    <Targets>Build</Targets>
  </ProjectReference>
</ItemGroup>