20

我在 MSBuild 项目中找不到有关ProjectReference标签的文档。我在哪里可以阅读它的详细说明?

编辑: 我有一个.vcxproj由其他人创建的。它包含ProjectReference项目。ProjectReference包含子标签:Private, ReferenceOutputAssembly, CopyLocalSatelliteAssemblies, LinkLibraryDependencies, UseLibraryDependencyInputs. 我在哪里可以阅读这些标签?它们可以包含哪些值?ProjectReference还可以包含哪些其他子标签?

我在 MSDN 和 Google 中搜索过,但没有找到文档页面,只有关于其他产品的讨论和文档,而不是 MSBuild。

4

3 回答 3

10

从 Jason Pyeron 在他的评论中提供的 MSBuild 源代码链接开始,我了解到,当 MSBuild 准备构建依赖项时,它包括每个项目的所有项目元数据(您称为子标签)ProjectReference。因此,下游任务和目标可以并且有时确实可以读取任意ProjectReference元数据。

有关 C++ 项目的问题的答案,您可以检查Microsoft.CppBuild.targetsMicrosoft.CppCommon.targets(它们在 MSBuild 14 中的默认路径,与 Visual Studio 2015 一致,是C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\)。然而,正如以下示例所示,这样做并不简单:

  1. Microsoft.CppBuild.targets中,Target动态ResolvedXDCMake创建_ResolvedNativeProjectReferencePathsItems。
  2. Target 从这些项目中动态ComputeReferenceLinkInputs创建ProjectReferenceToLink项目。
  3. 对于每个没有CopyLocal元数据的项目,相同的目标会添加它,复制任何Private元数据值。
  4. 对于每个具有不同路径的项目,相同的目标会Link动态创建一个项目。
  5. 现在切换到Microsoft.CppCommon.targets,项目在目标中的任务参数Link中传递!虽然公平地说,它们的元数据在上一步中已被清除,因此在这种特殊情况下您不必深入研究Target 文档。SourcesLinkLinkLink

以下是与您的问题相关的其他部分:

参数

  • Include(属性):项目文件的路径
  • Project(元数据):项目 GUID,格式为 {00000000-0000-0000-0000-000000000000}
  • ReferenceOutputAssembly(元数据):布尔值,指定是否应将所引用项目的输出传递给编译器。默认为真。
  • SpecificVersion(元数据):是否应使用程序集的确切版本。
  • Targets(元数据):应构建的引用项目中的目标的分号分隔列表。Default 是$(ProjectReferenceBuildTargets)其默认值为空的值,表示默认目标。
  • OutputItemType(元数据):将目标输出发送到的项目类型。默认为空白。如果ReferenceOutputAssembly设置为“true”(默认),那么目标输出将成为编译器的引用。
  • EmbedInteropTypes(元数据):可选布尔值。此引用中的类型是否需要嵌入到目标程序集中 - 仅限互操作程序集

评论

当使用OutputItemType参数时,附加参数(元数据)可能适用。例如,当OutputItemType设置为时ContentCopyToOutputDirectory可以使用:

  • CopyToOutputDirectory(元数据):可选字符串。确定是否将文件复制到输出目录。值:Never, Always, PreserveNewest.
于 2017-02-24T23:19:34.273 回答
6

您会注意到 ProjectReference 元素是 ItemGroup 元素的子元素。

谢天谢地,ItemGroups 是一个完整记录的模式项。您会发现 ItemGroups 的子元素可以是任何东西。将其视为集合的名称。ItemGroup 中的那个项目可以有“元数据”值。

例如,

<ItemGroup>
    <WindowsFiles Include="C:\Windows\*">
       <IsSystem>true</IsSystem>
    </WindowsFiles>
</ItemGroup>

这是定义一个名为 WindowsFiles 的项目组。它本质上变成了与 Include 属性匹配的文件的集合。所有项目组项目都有内置的元数据 - 例如文件名、扩展名、完整路径、目录等,但您可以添加自己的 - 在这种情况下 IsSystem 是附加的。

引用项目组通过以下两种方式之一完成:

<Message Text="%(WindowsFiles.FullPath)"/>

<Message Text="@(WindowsFiles->'%(FullPath)')"/>

后者被称为更高级的变换。最好坚持前者,直到您了解 ItemGroups 或转换就不会进入。

您感兴趣的 ProjectReference 项目组将由某个目标文件处理。由于项目组的名称相当随意,因此从概念上讲,它们是变量,因此定义用途的目标文件如何处理它们。

沿着 Import 语句中提到的文件查找 ProjectReference 项组的使用位置。

于 2012-06-27T20:53:36.963 回答
0

MSDN 上的这个网页似乎有一些很好的信息:

https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2017

于 2018-12-06T17:52:47.513 回答