MSBuild ProjectReference 项目参考项文档

25

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

编辑: 我有一个由其他人创建的.vcxproj文件。它包含ProjectReference项。ProjectReference包含子标签:PrivateReferenceOutputAssemblyCopyLocalSatelliteAssembliesLinkLibraryDependenciesUseLibraryDependencyInputs。我在哪里可以阅读有关这些标签的内容?它们可以包含哪些值?ProjectReference还可以包含哪些其他子标签?

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


2
这取决于你对“详细”的定义。你可以从这里开始。当然,谷歌博士也会很乐意帮助你。你想用它实现什么? - Christian.K
@Christian.K 在网页http://msdn.microsoft.com/en-us/library/bb629388.aspx中找不到Word ReferenceOutputAssembly。 - sergtk
1
@sergtk,我所评论的问题原始版本并没有提到“Edit:”段落,因此也没有提到“ReferenceOutputAssembly”;我链接的页面是关于原始版本的“ProjectReference”的。 - Christian.K
MSBuild 仓库文档中还有更多信息:ProjectReference Protocol - Alexander Malakhov
2个回答

12

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

对于关于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 项目在 Link 目标的 Sources 参数中传递!虽然公正地说,在前一步中它们的元数据已被清除,因此您在这种特定情况下不必深入研究 Link 目标文档。

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

参数

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

备注

当使用OutputItemType参数时,可能适用其他参数(元数据)。例如,当将OutputItemType设置为Content时,可以使用CopyToOutputDirectory
  • CopyToOutputDirectory(元数据):可选的字符串。确定是否将文件复制到输出目录。值:NeverAlwaysPreserveNewest

6
你会注意到ProjectReference元素是ItemGroup元素的子元素。
幸运的是,ItemGroups是一个完全记录的模式项。你会发现,ItemGroups的子元素可以是任何东西。把它想象成一个集合的名称。该ItemGroup中的项目可以有“元数据”值。
例如,
<ItemGroup>
    <WindowsFiles Include="C:\Windows\*">
       <IsSystem>true</IsSystem>
    </WindowsFiles>
</ItemGroup>

这是定义了一个名为WindowsFiles的ItemGroup。它实质上成为了与Include属性匹配的文件集合。所有的ItemGroup项都内置了元数据,如文件名、扩展名、全路径、目录等,但你也可以添加自己的元数据——在这个例子中,IsSystem就是一个额外的元数据。

引用ItemGroup有两种方式:

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

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

后者称为高级转换。在理解ItemGroups之前,最好坚持使用前者,否则转换将无法进行。

你感兴趣的ProjectReference ItemGroup将通过某个targets文件进行处理。由于itemgroups在名称上相当随意,概念上它们是变量,所以它们如何被targets文件处理定义了用法。

逐步查看Import语句中提到的文件,以查看ProjectReference item group的使用情况。


5
你说它们已经有完整的记录,但没有提供文件的参考。 - jgreep
更新的链接,但仍不太有用:https://github.com/dotnet/msbuild/blob/master/src/MSBuild/Microsoft.Build.xsd 和 https://github.com/dotnet/msbuild/blob/master/src/MSBuild/MSBuild/Microsoft.Build.CommonTypes.xsd。 - Simpleton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接