asp.net webapi публікація - файли xml не копіюються


77

У мене є проект MVC 4.0 WebApi з автоматично створеною довідкою на основі цього .

Мої моделі класів зберігаються це ще один проект у моєму рішенні. Генерація файлу xml увімкнена для кожного проекту (Властивості проекту -> Збірка -> Вихід -> Файл документації XML - Увімкнено).

У локальній налагодженні все нормально - файли xml копіюються в каталог проектів, і я бачу коментарі до полів / класів з інших проектів.

Але коли я використовую профіль публікації (у папку), файли xml не копіюються у вихідну папку. Копіюється лише один файл xml з основного проекту WebApi. Тому я не бачу коментарів до занять з інших проектів.


Відповіді:


203

У мене було подібне питання, для мене відповідь була трохи "дох!" момент.

У налаштуваннях проекту я ввімкнув файл документації XML лише під конфігурацією налагодження, а не під Release. Я використовував Release, і тому документація XML фактично не генерувалася. Тож виправлення переконалося, що ввімкнуло документацію XML як для налагодження, так і для випуску.


7
Це теж була моя проблема!
розчавити

6
Інші рішення можуть працювати, але це перше, що слід перевірити!
Альфредо А.

1
ти бог серед людей!
Бен,

3
Приємна відповідь, але навіть якщо ця опція увімкнена для Release, файл присутній у папці bin / Release, але Publish не копіює файл.
MeanGreen

2
А також натисніть, Show All Filesпереконайтесь, що файли .xml єIncluded In Project
поза часом

42

Ви можете зробити це двома різними способами:

1) Перейдіть до властивості вашого проекту -> виберіть варіант збірки -> поставте галочку біля «Файл документації XML» -> додайте шлях «App_data \ XMLDocument.xml» -> налаштування збереження, побудуйте свій проект -> включіть свій XMLDocument. файл xml -> вибрати властивість -> скопіювати у вихідний каталог -> вибрати "Копіювати завжди"

2) Перейдіть до властивості вашого проекту -> виберіть опцію «Пакування / Публікація в Інтернеті» -> елементи для відображення -> виберіть зі спадного меню «всі файли в цьому проекті»


Уточнення: якщо ви зробите пункт 1) в обох проектах, то в основному проекті API в папці / bin / App_Data ви скопіюєте обидва xml-документи.
Юрі

5
Ви дійсно не хочете використовувати "копіювати завжди". Просто встановіть для них тип "Вміст". Якщо ви встановите "копіювати завжди", ви отримаєте додаткову копію від App_Data в каталозі bin.
TechSavvySam

5
Другий спосіб для мене недоступний. Не вдається скопіювати файл xml_documentation у binпапку. xmldocument генерується іншим проектом бібліотеки класів. не веб-проект, який я опублікував. BTW у vs2015
huoxudong125

28

У мене була та сама проблема, що було розгорнуто лише файл xml із проекту webapi.

Щоб це виправити, мені довелося додати це до мого файлу проекту Web (Api), у межах першого PropertyGroupелемента.

<ExcludeXmlAssemblyFiles>false</ExcludeXmlAssemblyFiles>

Після цього було опубліковано документацію xml-файлів усіх проектів (де це включено) !


Мені довелося додати цю властивість, а також виконати виправлення, описане у відповіді @grimus, наданому для її роботи. Дякуємо, що додали цю відповідь!
drewmerk

Це виправлення зробило це для мене
sebastian.roibu,

1
Блін, ось чому я так люблю. Відповідь розміщена майже через 4 роки після того, як було задано питання, яке повністю вирішило мою проблему. Дякую вам сер! Це працює :) Документація щодо цієї властивості в основному не існує. Я не міг нічого знайти в Інтернеті. В основному вам потрібно заглянути, $(VSToolsPath)\WebApplications\Microsoft.WebApplication.targetsщоб побачити, що відбувається.
Маріуш Павельський

Сюди входить весь .xml усіх збірок. Якщо вам потрібно включити лише декілька конкретних, скористайтеся методом відповіді
@Keith

28

Я зміг вирішити це, використовуючи лише власну ціль MSBuild у профілі публікації .pubxml файлі . Виконайте наведені нижче дії.

Кінцевим результатом є те, що ціль MSBuild скопіює всі .xmlфайли з папки bin Web API в папку bin, де ви публікуєте. Не потрібно копіювати ці файли в App_Data.

1) Відкрийте відповідний .pubxmlфайл із [Project Folder]\Properties\PublishProfiles.

2) Додайте цей фрагмент до <Project><PropertyGroup>тегу:

<CopyAllFilesToSingleFolderForPackageDependsOn>
  CustomCollectFiles;
  $(CopyAllFilesToSingleFolderForPackageDependsOn);
</CopyAllFilesToSingleFolderForPackageDependsOn>

<CopyAllFilesToSingleFolderForMsdeployDependsOn>
  CustomCollectFiles;
  $(CopyAllFilesToSingleFolderForMsdeployDependsOn);
</CopyAllFilesToSingleFolderForMsdeployDependsOn>

3) Додайте цей фрагмент після <PropertyGroup>тегу:

      <Target Name="CustomCollectFiles">
        <ItemGroup>
          <_CustomFiles Include="bin\*.xml" />

          <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>bin\%(Filename)%(Extension)</DestinationRelativePath>
          </FilesForPackagingFromProject>
        </ItemGroup>
      </Target>

Заслуга належить цій відповіді, яка стосувалася способу включення файлів, що не входять до каталогу проекту, під час публікації.


1
На жаль, це рішення не працює для веб-розгортання.
Олександр Павленко

6
Ооочень близько. Кредит Івану та його посилання на asp.net/mvc/overview/deployment/visual-studio-web-deployment/… . Вам потрібно було також додати дублікат xml-вузла "CopyAllFilesToSingleFolderForPackageDependsOn" з написом "CopyAllFilesToSingleFolderForMsdeployDependsOn". Таким чином MsDeploy також буде працювати.
cdmdotnet

8

Відкрийте свій файл публікації (* .pubxml) і включіть цей код в елемент "Проект":

<ItemGroup>
    <Content Include="bin\yourDocumentationFile.xml">
        <CopyToOutputDirectory>true</CopyToOutputDirectory>
    </Content>
    <!-- Include a content to each documentation file -->
</ItemGroup>

7

Один із способів - це додати файли XML до папки " App_Data " всередині проекту, а потім у візуальній студії вибрати файл до його властивості " Копіювати до каталогу Ouput " до " Завжди ".введіть тут опис зображення


1
Чи правильно розумію, що слід вручну скопіювати файл xml до проекту Api і повторювати його після кожного змінення коментаря / коду?
Олександр Субботін

2
Ні, у Visual Studio клацніть правою кнопкою миші папку app_data, а потім виберіть Додати існуючі елементи. Потім виберіть вихідні файли XML, щоб додати їх до проекту. Нарешті, встановіть для копії вихідний каталог завжди.
Тоан Нгуєн,

3
Ви дійсно не хочете використовувати "копіювати завжди". Просто встановіть для них тип "Вміст". Якщо ви встановите "копіювати завжди", ви отримаєте додаткову копію від App_Data в каталозі bin.
TechSavvySam

4
Це не має жодного сенсу. Файли xml генеруються під час процесу збірки. Вони не є частиною проекту.
ewahner


0

Якщо ваш сайт використовує профіль публікації (наприклад, якщо ви завантажили його від свого постачальника послуг Інтернету), вам потрібно переконатися, що для наступної опції встановлено значення False

<ExcludeApp_Data>False</ExcludeApp_Data>

Властивості файлу XML можна встановити так: Дія побудови - Вміст, Копіювати у вихідний каталог - Завжди

Але якщо для параметра опублікування для параметра вище вказано значення True, тоді ваш XML-файл ніколи не буде опублікований. Навчився цього важким шляхом.


-1

Якщо ви не хочете Файл документації, перейдіть до HelpPageConfig.cs і залиште коментар

config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.