Wofür ist in einer .csproj-Datei <None Include = “…”>?

137

Wie ist

<None Include="C:\foo.bar" />

anders als

<Content Include="C:\foo.bar" />

?

Emmett
quelle
7
Ich hatte ein paar Contents geändert zu Nones. Ich denke, es ist passiert, als ich bei der Konvertierung in Razor Dateien von .ascx in .cshtml umbenannt habe. Durch manuelles Zurücksetzen wurden einige meiner Bereitstellungsprobleme behoben. Ich bin froh, dass ich das gefunden habe.
Chris

Antworten:

135

Der MSDN-Artikel zur Build-Aktionseigenschaft erläutert die Unterschiede.

Keine - Die Datei ist nicht in der Projektausgabegruppe enthalten und wird beim Erstellungsprozess nicht kompiliert. Ein Beispiel ist eine Textdatei, die Dokumentation enthält, z. B. eine Readme-Datei.

Inhalt - Die Datei wird nicht kompiliert, sondern ist in der Ausgabegruppe Inhalt enthalten. Diese Einstellung ist beispielsweise der Standardwert für eine .htm- oder eine andere Art von Webdatei.

adrianbanks
quelle
5
Vielen Dank, ich hatte Probleme, diese Referenz zu finden.
Emmett
Hilfreich, aber warum überhaupt ein "Keine" -Element, wenn die Datei nicht in die Ausgabe aufgenommen werden soll? Was ist der Punkt?
JimH44
1
@ JimH44 <Keine> Elemente werden häufig verwendet, um Dateien speziell in das Ausgabeverzeichnis zu kopieren, obwohl sie standardmäßig nicht in der Ausgabegruppe enthalten sind . Wenn Sie für eine <None> -Datei "In Ausgabeverzeichnis kopieren" -> "Immer kopieren" auswählen, wird diese kopiert, und der zur .csproj-Datei des Projekts hinzugefügte Eintrag enthält einen <None> -Eintrag für die Datei.
Auffälliger Compiler
3
Was ist dann der Unterschied zwischen einer <None> -Datei mit "In Ausgabeverzeichnis kopieren" -> "Immer kopieren" und einer <Inhalt> -Datei mit "In Ausgabeverzeichnis kopieren" -> "Immer kopieren"?
Hashtabelle
30

Ein Unterschied besteht darin, wie sie veröffentlicht werden. "Keine" Elemente werden nicht in eine Veröffentlichung aufgenommen, "Inhalt" -Elemente jedoch. Zum Beispiel im Dialogfeld "Anwendungsdateien" auf der Registerkarte "Veröffentlichen".

Marc Gravell
quelle
8
Nicht wahr. Zumindest im neuen Punktnetz cli. Wenn Sie ein Element als "Keine" mit einem CopyToOutputDirectorySatz deklariert haben , wird truees am dotnet publish
Uhr
13

Ich bin nicht 100% sicher (ich habe die MSDN-Beschreibung der Build Action- Eigenschaft gelesen ), aber nur das Kopieren dieser Antwort von MSDN nach StackOverflow beantwortet die Frage für mich nicht vollständig.

Der Unterschied zwischen " Keine" und " Inhalt" wirkt sich nur auf Webprojekte aus. Für ein Befehlszeilenprojekt, ein WinForm-Projekt oder ein UnitTest-Projekt (in meinem Fall) usw. Keine und Inhalt haben kein unterschiedliches Verhalten.

MSDN: "Projektausgabegruppe" oder "Inhaltsausgabegruppe" nur Begriffe, die in einem Webprojekt verwendet werden, richtig?

hfrmobile
quelle
2
Wie Sie sagen, scheint Nonevs Contentnur Auswirkungen auf den Veröffentlichungsschritt zu haben , nicht auf den Erstellungsschritt . Für den Build-Schritt CopyToOutputDirectorykann anscheinend entweder gesetzt werden, und das steuert, ob die Datei vom Build-Schritt kopiert wird. Es scheint auch seltsam, dass standardmäßig T4-Vorlagen als ContentElemente und nicht als Elemente hinzugefügt Nonewerden.
Christopher King
8

In meiner Situation hatte meine MSBuild-Datei eine ItemGroupfür Bildressourcen, die wie folgt aussah:

  <ItemGroup>
    <Content Include="Resources\image001.png" />
    <Content Include="Resources\image002.png" />
    <Content Include="Resources\image003.png" />
    <Content Include="Resources\image004.png" />
    <None Include="Resources\image005.png" />
    <None Include="Resources\image006.png" />
    <None Include="Resources\image007.png" />
  </ItemGroup>

Während mein Projekt gut lief, fragte ich mich, warum ich eine Mischung aus Elementen Contentund NoneElementen vom Typ Element in meinem hatte ItemGroup. Dieser MSDN-Artikel (für Visual Studio 2010) gab mir die Anleitung, nach der ich gesucht habe:

Beachten Sie, dass der Ressourceneditor beim Hinzufügen eines Bilds die Build-Aktion auf Keine setzt , da die RESX-Datei auf die Bilddatei verweist. Während der Erstellung wird das Image in die aus der .resx-Datei erstellte .resources-Datei gezogen. Auf das Bild kann dann einfach über die stark typisierte Klasse zugegriffen werden, die automatisch für die .resx-Datei generiert wird. Daher sollten Sie diese Einstellung nicht in " Eingebettete Ressource" ändern , da dies das Bild zweimal in die Assembly einschließen würde.

Auflösung: Mit dieser Führung, mit einem Texteditor, änderte ich die ContentArt Artikel Elemente None.

Eine Übersicht über MSBuild-Elemente finden Sie in diesem MSDN-Artikel .

DavidRR
quelle
3

Ich habe ein Projekt, das keine kompilierbaren Elemente enthält (es speichert HTML und Javascript für Jasmin-Unit-Tests).

Eines Tages hörte meine Lösung (die das Projekt enthielt) auf zu kompilieren und sagte "Das Ziel" Build "existiert nicht im Projekt".

Ich habe einen Import hinzugefügt, um den Compiler einzuschalten. Dieser funktionierte auf meinem Computer einwandfrei, konnte jedoch msbuild auf dem Build-Server nicht verwenden.

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Ich habe dann eine Zeile von geändert

<None Include="SpecRunner.html" />

zu

<Content Include="SpecRunner.html" />

und es funktionierte auch auf dem Build-Server.

cedd
quelle
2

Sie benötigen None in einer Vorlagenprojektdatei, um Dateien einzuschließen, die Sie in der .vstemplate definiert haben. Andernfalls gehen sie beim Erstellungs- und Übersetzungsprozess verloren. Sie bleiben in dem temporären Ordner zurück, in dem alles erstellt wird, und werden kurz darauf gelöscht.

CAD-Typ
quelle
1

In meinem Fall ist .Pubxml eine dieser Dateien in der Liste " Keine" . Es ist nicht für die Erstellung von Lösungen oder als statische Datei für Webprojekte gedacht. Um die Site jedoch in Azure zu veröffentlichen, sind die Konfigurationen darin enthalten.

Gemäß Microsoft-Artikel sind dies die Haupttypen, die wir unter .csproj- Datei-Tags sehen:

Keine - Die Datei ist nicht in der Projektausgabegruppe enthalten und wird beim Erstellungsprozess nicht kompiliert. Ein Beispiel ist eine Textdatei, die Dokumentation enthält, z. B. eine Readme-Datei.

Kompilieren - Die Datei wird in die Build-Ausgabe kompiliert. Diese Einstellung wird für Codedateien verwendet.

Inhalt - Die Datei wird nicht kompiliert, sondern ist in der Ausgabegruppe Inhalt enthalten. Diese Einstellung ist beispielsweise der Standardwert für eine .htm- oder eine andere Art von Webdatei.

Eingebettete Ressource - Diese Datei ist als DLL oder ausführbare Datei in die Ausgabe des Hauptprojekts eingebettet. Es wird normalerweise für Ressourcendateien verwendet.

krishna kanth
quelle
1
Bitte kommentieren Sie hier, wenn etwas irreführend oder nicht klar ist. Nur eine Abwärtsabstimmung hilft mir nicht, es besser zu verbessern. Danke im Voraus.
krishna kanth
1
Ich habe häufig die Fehlermeldung erhalten: Der Elementname "Keine" für "Eigenschaften \ PublishProfiles \ FolderProfile.pubxml" sollte "Inhalt" sein. in meinem Asp.Net-Projekt auf Bamboo, und manchmal kann der Build das Problem nur beheben, also weiß ich nicht, was genau das Problem ist
Bochen Lin
Hallo @BochenLin, die Details, die Sie hier erwähnt haben, sind etwas spärlich. Können Sie versuchen, hier weitere Details anzugeben oder eine neue Frage mit vollständigen Problemdetails und Screenshot zu posten, wenn möglich [und dann den Fragenlink hier teilen].
krishna kanth
0

Inhaltsdateien sind nicht in einem Build enthalten, sondern in einer Veröffentlichung.

Keine Dateien sind in einem Build oder einer Veröffentlichung enthalten, es sei denn, sie werden von Ihnen auf diese Weise konfiguriert. Beispielsweise führt eine Einstellung "In Ausgabeverzeichnis kopieren" von "Immer" oder "Neu" dazu, dass sie sowohl in einen Build als auch in eine Veröffentlichung aufgenommen werden.

carlin.scott
quelle