MSBuild ProjectReference项目文档

And*_*sev 14 c++ msbuild visual-c++

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

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

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

dau*_*hey 6

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

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

例如,

<ItemGroup>
    <WindowsFiles Include="C:\Windows\*">
       <IsSystem>true</IsSystem>
    </WindowsFiles>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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

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

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

<Message Text="@(WindowsFiles->'%(FullPath)')"/>
Run Code Online (Sandbox Code Playgroud)

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

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

按您的方式向上导入导入语句中提到的文件,以查看使用 ProjectReference 项组的位置。

  • 你说他们有完整的文档,但不包括对文档的引用。 (5认同)

wei*_*eir 6

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

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

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

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

参量

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

备注

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

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