Документация к статье MSBuild ProjectReference
Я не могу найти документацию о теге ProjectReference
в проектах MSBuild. Где я могу прочитать подробное описание?
Edit:
У меня есть .vcxproj
, созданный другими. Он содержит элемент ProjectReference
. ProjectReference
содержит subtags: Private
, ReferenceOutputAssembly
, CopyLocalSatelliteAssemblies
, LinkLibraryDependencies
, UseLibraryDependencyInputs
. Где я могу прочитать об этих тегах? Какие значения они могут содержать? Какие еще субтитры могут содержать ProjectReference
?
Я искал в MSDN и Google, но не нашел страниц документации, только обсуждения и документацию о других продуктах, а не MSBuild.
Ответы
Ответ 1
Вы заметите, что элемент 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
Начиная с ссылок на исходный код MSBuild, которые Jason Pyeron предоставил в своем комментарии, я узнал, что когда MSBuild готовит зависимости сборки, включает в себя все метаданные элементов (то, что вы называете subtags) из каждого элемента ProjectReference
. В результате нижележащие задачи и задачи могут и иногда читать произвольные метаданные ProjectReference
.
Для ответов на ваши вопросы о проектах на С++ вы можете изучить Microsoft.CppBuild.targets
и Microsoft.CppCommon.targets
(их путь по умолчанию в MSBuild 14, совпадающий с Visual Studio 2015, равен C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\
). Однако, как показано в следующем примере, это не так просто:
- В
Microsoft.CppBuild.targets
Target ResolvedXDCMake
создает элементы _ResolvedNativeProjectReferencePaths
динамически.
- Из этих элементов Target
ComputeReferenceLinkInputs
динамически создает элементы ProjectReferenceToLink
.
- Для каждого из тех элементов, у которых нет метаданных
CopyLocal
, тот же Target добавляет его, копируя любое значение метаданных Private
.
- Для каждого из этих элементов с отдельным путем одна и та же цель создает элемент
Link
динамически.
- Теперь переход в
Microsoft.CppCommon.targets
, Link
элементов передается в параметре Sources
задачи Link
в Link
Target! Хотя это справедливо, их метаданные были очищены на предыдущем шаге, поэтому вам не нужно погружаться в документацию Link
Target в этом конкретном случае.
Вот дополнительные части, которые связывают ваш вопрос:
Параметры
-
Include
(атрибут): путь к файлу проекта
-
Project
(метаданные): GUID проекта, в форме {00000000-0000-0000-0000-000000000000}
-
ReferenceOutputAssembly
(метаданные): Boolean, определяющий,
выходы указанного проекта должны быть переданы компилятору.
Значение по умолчанию - true.
-
SpecificVersion
(метаданные): следует ли использовать точную версию сборки.
-
Targets
(метаданные): список целей, разделенных точкой с запятой, в проектах, на которые должны быть построены ссылки. Значение по умолчанию - значение $(ProjectReferenceBuildTargets)
, значение по умолчанию пуста, указывающее целевые значения по умолчанию.
-
OutputItemType
(метаданные): тип элемента для ввода целевых выходов. Значение по умолчанию - пустое. Если для параметра ReferenceOutputAssembly
установлено значение "true" (по умолчанию), то целевые выходы станут ссылками для компилятора.
-
EmbedInteropTypes
(метаданные): необязательный логический. Нужны ли типы в этой ссылке встраиваться в целевую сборку - только для взаимодействия только
Примечания
Когда используется параметр OutputItemType
, могут применяться дополнительные параметры (метаданные). Например, если OutputItemType
установлен в Content
, можно использовать CopyToOutputDirectory
:
- CopyToOutputDirectory (метаданные): необязательная строка. Определяет, следует ли копировать файл в выходной каталог. Значения:
Never
, Always
, PreserveNewest
.
Ответ 3
На этой веб-странице в MSDN есть хорошая информация:
https://docs.microsoft.com/en-us/visualstudio/msbuild/common-msbuild-project-items?view=vs-2017