我在MSBuild项目中找不到有关ProjectReference
标记的文档。我在哪里可以阅读它的详细描述?
修改
我有一个.vcxproj
由其他人创建。它包含ProjectReference
项。 ProjectReference
包含子标记:Private
,ReferenceOutputAssembly
,CopyLocalSatelliteAssemblies
,LinkLibraryDependencies
,UseLibraryDependencyInputs
。我在哪里可以阅读这些标签?它们可以包含哪些值? ProjectReference
可以包含哪些其他子标记?
我在MSDN和Google上搜索过但没有找到文档页面,只有关于其他产品的讨论和文档,而不是MSBuild。
答案 0 :(得分:5)
从Jason Pyeron在评论中提供的MSBuild源代码链接开始,我了解到当MSBuild从每个ProjectReference
项目准备构建依赖项时,it includes all item metadata(您称之为子标记)。因此,下游任务和目标可以并且有时会读取任意ProjectReference
元数据。
有关C ++项目的问题的答案,您可以检查Microsoft.CppBuild.targets
和Microsoft.CppCommon.targets
(它们在MSBuild 14中的默认路径,与Visual Studio 2015一致,为C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\
)。但是,如下例所示,这样做并不简单:
Microsoft.CppBuild.targets
中,目标ResolvedXDCMake
动态创建_ResolvedNativeProjectReferencePaths
项目。ComputeReferenceLinkInputs
动态创建ProjectReferenceToLink
个项目。CopyLocal
元数据的项目,相同的目标会添加它,复制任何Private
元数据值。Link
项目。Microsoft.CppCommon.targets
,Link
项目会传递到Sources
目标中Link
任务的Link
参数中!虽然公平,但他们的元数据已在上一步中被清除,因此您无需深入了解此特定情况下的Link
目标文档。以下是与您的问题相关的其他部分:
<强>参数强>
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
:
Never
,Always
,PreserveNewest
。答案 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)