MSBuild 项目参考项文档



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

编辑:我有一个别人创造的.vcxproj。它包含ProjectReference项目。 ProjectReference包含子标签:PrivateReferenceOutputAssemblyCopyLocalSatelliteAssembliesLinkLibraryDependenciesUseLibraryDependencyInputs。我在哪里可以阅读有关这些标签的信息?它们可以包含哪些值?ProjectReference还可以包含哪些其他子标签?

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

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

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

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

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

参数

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

言论

使用 OutputItemType 参数时,其他参数(元数据)可能适用。例如,当OutputItemType设置为 Content 时,可以使用CopyToOutputDirectory

  • CopyToOutputDirectory(元数据):可选字符串。确定是否将文件复制到输出目录。值:NeverAlwaysPreserveNewest

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

值得庆幸的是,项组是一个完整记录的架构项。 你会发现,ItemGroups 的子元素可以通过任何方式。 将其视为集合的名称。 项组中的该项可以具有"元数据"值。

例如

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

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

引用物料组可通过以下两种方式之一完成:

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

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

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

逐步处理 Import 语句中提到的文件,以查看 ProjectReference 项组的使用位置。

最新更新