Как создать XML-документацию для CSPROJ с несколькими целями

У меня есть проект библиотеки с несколькими целями, например. в файле CSPROJ он имеет:

<TargetFrameworks>net40;net46;net461;net462;net47</TargetFrameworks>

Если мне нужна XML-документация для всех комбинаций этих целевых платформ и конфигураций Debug и Release, я должен выбрать каждую из них по очереди в пользовательском интерфейсе с помощью диспетчера конфигураций сборки, а затем настроить его для создания XML-документации для этой комбинации, и затем каждая комбинация будет указана отдельно как PropertyGroup в CSPROJ с предполагаемым выходным файлом для XML-документации.

Есть ли способ лучше?

Публикую вопрос и ответ, потому что я не нашел этого нигде в Интернете


person Ian Mercer    schedule 04.11.2017    source источник


Ответы (2)


Самый простой способ — установить для свойства GenerateDocumentationFile значение true. Пользовательский интерфейс VS хочет установить путь, целевые объекты MSBuild установят для этого свойства значение true, если путь задан, или зададут путь по умолчанию, если свойство GenerateDocumentationFile равно true. Итак, вы можете добавить это в свой файл csproj:

<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

Если вы хотите установить значение true для всех ваших проектов, создайте файл с именем Directory.Build.props в каталоге вашего решения со следующим содержимым, и он будет автоматически импортирован во все проекты в иерархии каталогов ниже:

<Project>
  <PropertyGroup>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
  </PropertyGroup>
</Project>
person Martin Ullrich    schedule 05.11.2017
comment
К сожалению, это не работает со старыми проектами .NET Framework. - person ceztko; 16.10.2018
comment
Вопрос был именно о новом формате csproj, способном работать с несколькими целями. Вы можете скопировать файл код SDK для этого в Directory.Build.targets - person Martin Ullrich; 17.10.2018
comment
Спасибо. Я пробовал что-то подобное, но с использованием переменной $(TargetName), но это не сработало, пока я не поставил директиву DocumentationFile после импорта Microsoft.CSharp.targets. Я буду предлагать код SDK, который вместо этого использует $(AssemblyName) - person ceztko; 17.10.2018
comment
Да, $(AssemblyName) подходит везде после первого импорта. Я использую что-то вроде следующего, и это работает: <DocumentationFile>$(OutputPath)\$(AssemblyName).xml</DocumentationFile> и это работает. - person ceztko; 04.11.2018
comment
Я также попытался поместить GenerateDocumentationFile строк в Directory.Build.targets, как вы предлагаете, и это сработало как шарм! Я рекомендую также добавить предложение в ваш ответ, чтобы еще лучше обогатить его для проектов, не связанных с SDK. - person ceztko; 05.06.2019

Один из способов исправить это — включить в каждый файл CSPROJ следующее:

<!-- Build XML documentation for all combinations of target framework x configuration -->
<PropertyGroup>
 <DocumentationFile>bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml 
 </DocumentationFile>
</PropertyGroup>

Еще лучший способ — создать ссылку на общий файл конфигурации:

<!-- This must come after any other configuration so that it overwrites it -->
<Import Project="$(MSBuildThisFileDirectory)..\Shared.msbuild" />

... а затем поместите приведенные выше строки в этот общий файл конфигурации, где вы также можете установить все другие параметры CSPROJ для всего решения, такие как Product, Company, Copyright, ...

person Ian Mercer    schedule 04.11.2017