asp.net webapi veröffentlichen - XML-Dateien werden nicht kopiert

77

Ich habe MVC 4.0 WebApi-Projekt mit automatisch generierter Hilfe basierend auf diesem .

Meine Modellklassen werden in anderen Projekten in meiner Lösung gespeichert. Die Generierung einer XML-Datei ist für jedes Projekt aktiviert (Projekteigenschaften -> Erstellen -> OutPut -> XML-Dokumentationsdatei - Aktiviert).

Im lokalen Debug ist alles in Ordnung - XML-Dateien werden in das Projektverzeichnis kopiert und ich sehe Kommentare für Felder / Klassen aus anderen Projekten.

Aber wenn ich das Veröffentlichungsprofil (in Ordner) verwende, werden XML-Dateien nicht in den Ausgabeordner kopiert. Es wird nur eine XML-Datei aus dem WebApi-Hauptprojekt kopiert. Daher sehe ich keine Kommentare zu Klassen aus anderen Projekten.

Alexander Subbotin
quelle

Antworten:

201

Ich hatte ein ähnliches Problem, für mich war die Antwort ein bisschen "doh!" Moment.

In den Projekteinstellungen hatte ich die XML-Dokumentationsdatei nur unter der Debug-Konfiguration und nicht unter Release aktiviert. Ich habe mit Release bereitgestellt, sodass die XML-Dokumentation nicht generiert wurde. Das Update stellte also sicher, dass die XML-Dokumentation sowohl für Debug- als auch für Release-Konfigurationen aktiviert wurde.

Grimus
quelle
7
Das war auch mein Problem!
Crush
6
Die anderen Lösungen funktionieren möglicherweise, aber dies ist das erste, was überprüft werden muss!
Alfredo A.
1
Du bist ein Gott unter den Menschen!
Ben
3
Gute Antwort, aber selbst wenn diese Option für Release aktiviert ist, befindet sich die Datei im Ordner bin / Release, aber Publish kopiert die Datei nicht.
MeanGreen
2
Und klicken Sie auch, Show All Filesum sicherzustellen, dass .xml-Dateien sindIncluded In Project
Timeless
42

Sie können dies auf zwei verschiedene Arten tun:

1) Gehen Sie zu Ihrer Projekteigenschaft -> wählen Sie die Erstellungsoption -> überprüfen Sie "XML-Dokumentationsdatei" -> fügen Sie den Pfad "App_data \ XMLDocument.xml" hinzu -> speichern Sie die Einstellung, erstellen Sie Ihr Projekt -> fügen Sie Ihr XMLDocument hinzu. XML-Datei -> Eigenschaft auswählen -> In Ausgabeverzeichnis kopieren -> "Immer kopieren" auswählen

2) Gehen Sie zu Ihrer Projekteigenschaft -> wählen Sie die Option "Web packen / veröffentlichen" -> anzuzeigende Elemente -> wählen Sie "alle Dateien in diesem Projekt" aus der Dropdown-Liste aus

Chandrika Prajapati
quelle
Erläuterung: Wenn Sie Punkt 1) in beiden Projekten ausführen, werden im Haupt-API-Projekt unter dem Ordner / bin / App_Data beide XML-Dokumente kopiert.
Juri
5
Sie möchten wirklich nicht "immer kopieren" verwenden. Stellen Sie sie einfach auf "Inhalt" ein. Wenn Sie "Immer kopieren" festlegen, erhalten Sie eine zusätzliche Kopie von App_Data im Verzeichnis bin.
TechSavvySam
5
Die zweite Methode ist für mich nicht verfügbar. Die Datei xml_documentation kann nicht in den binOrdner kopiert werden . Das xmldocument wird von einem anderen Klassenbibliotheksprojekt generiert. nicht das Webprojekt, das ich veröffentlicht habe. BTW in vs2015
huoxudong125
28

Ich hatte das gleiche Problem, dass nur die XML-Datei aus dem Webapi-Projekt bereitgestellt wurde.

Um dies zu beheben, musste ich dies innerhalb des ersten PropertyGroupElements zu meiner Web (Api) -Projektdatei hinzufügen .

<ExcludeXmlAssemblyFiles>false</ExcludeXmlAssemblyFiles>

Danach wurde die Dokumentation XML-Dateien aller Projekte (wo es aktiviert ist) veröffentlicht !

Martinoss
quelle
Ich musste diese Eigenschaft hinzufügen und auch den in der Antwort @grimus beschriebenen Fix ausführen, damit sie funktioniert. Vielen Dank für das Hinzufügen dieser Antwort!
Zeichnungsmerkmal
Dieser Fix hat es für mich getan
sebastian.roibu
1
Verdammt, deshalb liebe ich SO. Die Antwort wurde fast 4 Jahre später veröffentlicht, nachdem eine Frage gestellt wurde, die mein Problem vollständig löst. Danke mein Herr! Es funktioniert :) Die Dokumentation für diese Eigenschaft ist grundsätzlich nicht vorhanden. Ich konnte online nichts finden. Sie müssen im Grunde schauen, um $(VSToolsPath)\WebApplications\Microsoft.WebApplication.targetszu sehen, was los ist.
Mariusz Pawelski
Dies beinhaltet alle .xml aller Assemblys. Wenn Sie nur einige bestimmte angeben müssen, verwenden Sie die @ Keith-Antwortmethode
JotaBe
28

Ich konnte dies mit nur einem benutzerdefinierten MSBuild-Ziel in der Veröffentlichungsprofildatei lösen .pubxml. Folgen Sie den unteren Schritten.

Das Endergebnis ist, dass dieses MSBuild-Ziel alle .xmlDateien aus dem bin-Ordner der Web-API in den bin-Ordner kopiert, in dem Sie veröffentlichen. Sie müssen diese Dateien nicht kopieren App_Data.

1) Öffnen Sie die entsprechende .pubxmlDatei von [Project Folder]\Properties\PublishProfiles.

2) Fügen Sie dieses Snippet in das <Project><PropertyGroup>Tag ein:

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

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

3) Fügen Sie dieses Snippet nach dem <PropertyGroup>Tag hinzu:

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

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

Gutschrift geht auf diese Antwort, die sich mit dem Einbeziehen von Dateien von außerhalb des Projektverzeichnisses beim Veröffentlichen befasst.

Keith
quelle
1
Leider funktioniert diese Lösung nicht für die Webbereitstellung.
Alexander Pavlenko
6
Sooo nah dran. Dank an Ivan und seinen Link zu asp.net/mvc/overview/deployment/visual-studio-web-deployment/… . Sie müssen außerdem einen doppelten XML-Knoten von "CopyAllFilesToSingleFolderForPackageDependsOn" mit der Bezeichnung "CopyAllFilesToSingleFolderForMsdeployDependsOn" hinzufügen. Auf diese Weise funktioniert MsDeploy auch.
cdmdotnet
8

Öffnen Sie Ihr Veröffentlichungsprofil (* .pubxml) und fügen Sie diesen Code in das Element "Projekt" ein:

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

Eine Möglichkeit besteht darin, die XML-Dateien zu Ihrem Ordner " App_Data " innerhalb des Projekts hinzuzufügen und dann in Visual Studio eine Datei mit der Eigenschaft "In Ausgabeverzeichnis kopieren " in " Immer " auszuwählen .Geben Sie hier die Bildbeschreibung ein

Toan Nguyen
quelle
1
Verstehe ich richtig, dass ich die XML-Datei manuell in das Api-Projekt kopieren und nach jeder Änderung des Kommentars / Codes wiederholen soll?
Alexander Subbotin
2
Nein, klicken Sie in Visual Studio mit der rechten Maustaste auf den Ordner app_data und wählen Sie dann vorhandene Elemente hinzufügen. Wählen Sie als Nächstes die XML-Ausgabedateien aus, um sie dem Projekt hinzuzufügen. Stellen Sie abschließend die Kopie auf Ausgabeverzeichnis auf immer ein.
Toan Nguyen
3
Sie möchten wirklich nicht "immer kopieren" verwenden. Stellen Sie sie einfach auf "Inhalt" ein. Wenn Sie "Immer kopieren" festlegen, erhalten Sie eine zusätzliche Kopie von App_Data im Verzeichnis bin.
TechSavvySam
4
Das macht keinen Sinn. Die XML-Dateien werden während des Erstellungsprozesses generiert. Sie sind nicht Teil des Projekts.
Ewahner
0

Wenn Ihre Site ein Veröffentlichungsprofil verwendet (z. B. wenn Sie eines von Ihrem ISP heruntergeladen haben), müssen Sie sicherstellen, dass die folgende Option auf "Falsch" gesetzt ist

<ExcludeApp_Data>False</ExcludeApp_Data>

Die Eigenschaften der XML-Datei können wie folgt festgelegt werden: Aktion erstellen - Inhalt, In Ausgabeverzeichnis kopieren - Immer

Wenn der obige Parameter im Veröffentlichungsprofil jedoch auf "Wahr" gesetzt ist, wird Ihre XML-Datei niemals veröffentlicht. Das habe ich auf die harte Tour gelernt.

Scott
quelle
-1

Wenn Sie die Dokumentationsdatei nicht möchten, gehen Sie zu HelpPageConfig.cs und Comment Out

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

Ryan Dooley
quelle