Документация к статье 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.