MSBuild ProjectReference项目文档

时间:2012-06-22 08:49:03

标签: c++ visual-c++ msbuild

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

修改 我有一个.vcxproj由其他人创建。它包含ProjectReference项。 ProjectReference包含子标记:PrivateReferenceOutputAssemblyCopyLocalSatelliteAssembliesLinkLibraryDependenciesUseLibraryDependencyInputs。我在哪里可以阅读这些标签?它们可以包含哪些值? ProjectReference可以包含哪些其他子标记?

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

3 个答案:

答案 0 :(得分:5)

从Jason Pyeron在评论中提供的MSBuild源代码链接开始,我了解到当MSBuild从每个ProjectReference项目准备构建依赖项时,it includes all item metadata(您称之为子标记)。因此,下游任务和目标可以并且有时会读取任意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中,目标ResolvedXDCMake动态创建_ResolvedNativeProjectReferencePaths项目。
  2. 从这些项目中,目标ComputeReferenceLinkInputs动态创建ProjectReferenceToLink个项目。
  3. 对于那些没有CopyLocal元数据的项目,相同的目标会添加它,复制任何Private元数据值。
  4. 对于具有不同路径的每个项目,同一目标会动态创建Link项目。
  5. 立即切换到Microsoft.CppCommon.targetsLink项目会传递到Sources目标中Link任务的Link参数中!虽然公平,但他们的元数据已在上一步中被清除,因此您无需深入了解此特定情况下的Link目标文档。
  6. 以下是与您的问题相关的其他部分:

    <强>参数

    • Include(属性):项目文件的路径
    • Project(元数据):项目GUID,格式为{00000000-0000-0000-0000-000000000000}
    • ReferenceOutputAssembly(metadata):布尔值,指定是否 引用的项目的输出应该传递给编译器。 默认为真。
    • SpecificVersion(元数据):是否应使用精确版本的程序集。
    • Targets(元数据):应该构建的引用项目中以分号分隔的目标列表。默认值为$(ProjectReferenceBuildTargets),其默认值为空,表示默认目标。
    • OutputItemType(元数据):将目标输出发送到的项类型。默认为空。如果ReferenceOutputAssembly设置为&#34; true&#34; (默认)然后目标输出将成为编译器的参考。
    • EmbedInteropTypes(元数据):可选布尔值。此引用中的类型是否需要嵌入到目标组件中 - 仅仅是interop asemblies

    <强>说明

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

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

答案 1 :(得分:4)

您会注意到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项目组的使用位置。

答案 2 :(得分:-1)