Verhindern, dass referenzierte Assembly-PDB- und XML-Dateien in die Ausgabe kopiert werden

117

Ich habe ein Visual Studio 2008 C # /. NET 3.5-Projekt mit einer Post-Build-Aufgabe, um den Inhalt zu komprimieren. Ich stelle jedoch fest, dass ich auch die PDF-Dateien (Debug) und XML-Dateien (Dokumentation) der referenzierten Assemblys in meinem Ausgabeverzeichnis (und in ZIP) erhalte.

Wenn MyProject.csproj beispielsweise auf YourAssembly.dll verweist und sich YourAssembly.xml- und YourAssembly.pdb-Dateien im selben Verzeichnis wie die DLL befinden, werden sie in meinem Ausgabeverzeichnis (und in ZIP) angezeigt.

Ich kann * .pdb beim ZIP ausschließen, aber ich kann die * .xml-Dateien nicht pauschal ausschließen, da ich Bereitstellungsdateien mit derselben Erweiterung habe.

Gibt es eine Möglichkeit, zu verhindern, dass das Projekt referenzierte Assembly-PDB- und XML-Dateien kopiert?

Jason Morse
quelle

Antworten:

68

Sie können dies auch über die Befehlszeile angeben:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
quelle
9
Dies scheint der richtige Weg zu sein, da Sie es einfach in Ihre MSBuild-Argumente für die Build-Definition aufnehmen können und nicht in csproj-Dateien hacken müssen.
Der Muffin-Mann
2
Dies funktioniert hervorragend mit TFS und erspart in meinem Fall die Änderung von Hunderten von Projekten
ste-fu
Funktioniert auch hervorragend mit Builds im TFS2018- und Nicht-XAML-Stil.
Knipp
saubere und schnelle Lösung. Danke
Karan
158

Ich wollte in der Lage sein, Assemblys, auf die verwiesen wird, in meiner primären Anwendung hinzuzufügen und zu entfernen, ohne die Notwendigkeit zu haben, zu pflegen, welche Dateien ich löschen oder ausschließen musste.

Ich Microsoft.Common.targetssuchte nach etwas, das funktionieren würde, und fand die AllowedReferenceRelatedFileExtensionsImmobilie. Der Standardwert ist .pdb; .xmlso , dass ich ihn explizit in meiner Projektdatei definiert habe. Der Haken ist, dass Sie etwas benötigen (Leerzeichen reichen nicht aus), andernfalls wird weiterhin die Standardeinstellung verwendet.

<Project ...>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <AllowedReferenceRelatedFileExtensions>
      <!-- Prevent default XML and PDB files copied to output in RELEASE. 
           Only *.allowedextension files will be included, which doesn't exist in my case.
       -->
      .allowedextension
    </AllowedReferenceRelatedFileExtensions> 
  </PropertyGroup>
Jason Morse
quelle
3
Dies mag der "richtige" Weg sein, aber es ist so versteckt, was in meinen Büchern schlecht ist.
Mladen Mihajlovic
1
Dies funktionierte beim Erstellen aus der Visual Studio-IDE. Beim Erstellen über MSBuild hat es bei mir jedoch nicht funktioniert. Ich sollte es nicht als / p-Option angeben müssen, wenn es in der Projektdatei enthalten ist.
Redcurry
19

Sie können einen Post Build-Ereignisbefehl ähnlich wie hinzufügen del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
quelle
Vielen Dank. Dies funktioniert, wenn Sie eine statische Liste der Assemblys haben, auf die verwiesen wird. In unserem Fall hatten wir jedoch über zwei Dutzend, von denen viele im Fluss waren, während wir umgestalteten.
Jason Morse
4
Persönlich denke ich, dass dies die richtige Antwort ist - auf die andere Weise haben Sie die Projektdatei gehackt und jeder andere (oder Sie selbst Jahre später) würde nicht wissen, wo er suchen muss, um zu sehen, wie dies verhindert wird.
Mladen Mihajlovic
1
Ich bevorzuge auch diesen Weg. Ich lasse gerne zu, dass alles, was passieren muss (oder ursprünglich geplant wurde), beendet wird, und lasse dann die Post-Build-Ereignisse es so machen, wie ich es am Ende will. Auf diese Weise scheint es einfach so viel sauberer zu sein!
Arvo Bowen
Obwohl diese Lösung funktioniert, ist sie nicht wirklich optimiert, da Sie Zeit verlieren, etwas zu kopieren, das Sie löschen möchten. Ich habe auch Pre / Post-Build-Schritte immer als Hacks betrachtet, da sie in einem Build-System nicht so gut funktionieren wie Ziele oder Projektdateien.
christ.s
Wow @ christ.s, * lach * Ich würde hoffen, dass das Visual Studio-Team in den zehn Jahren, seit ich diese Frage beantwortet habe, dies einfacher gemacht hätte. :-)
AndrewJacksonZA
5

Dies ist eine ziemlich alte Frage, aber da es keine Antwort gibt, wie das Generieren von PDB- und XML-Dateien über die Benutzeroberfläche deaktiviert werden kann, habe ich der Vollständigkeit halber angenommen, dass sie hier sein sollte.

In Visual Studio 2013: Deaktivieren Sie in den Projekteigenschaften auf der Registerkarte "Kompilieren" die Option "XML-Dokumentationsdatei generieren", klicken Sie darunter auf "Erweiterte Kompilierungsoptionen" und ändern Sie "Debug-Informationen generieren" in "Keine".

Dingo
quelle
15
Dies wirkt sich nicht auf Nuget-Pakete aus, die Sie enthalten, pdbund auf xmlDateien.
Lankymart
Ich verwende OctoPack-Eigenschaften in meiner csproj-Datei und dies hat den Trick für meine PDB- und XML-Dateien getan. Ich habe auch VS 2015 verwendet. Build -> Erweitert unter Ausgabe -> Debug-Info unter Ausgabe auf Keine setzen
Devin Prejean
0

Meine Antwort mag jetzt trivial sein, aber ich möchte das BAT-Skript, mit dem ich die XML-Dateien lösche, teilen, wenn es eine entsprechende DLL dafür gibt. Dies ist nützlich, wenn Sie nur den Ausgabeordner bereinigen möchten und andere XML-Dateien haben, die nicht entfernt werden sollen.

SETLOCAL EnableDelayedExpansion

SET targetDir=%1

ECHO Deleting unnecessary XML files for dlls

FOR %%F IN (%targetDir%*.xml) DO (

  SET xmlPath=%%~fF
  SET dllPath=!xmlPath:.xml=.dll!

  IF EXIST "!dllPath!" (
    ECHO Deleting "!xmlPath!"
    DEL "!xmlPath!"
  )
)

Verwendung:

Cleanup.bat c:\my-output-folder\

Ich brauchte eine Stunde, um diese einfache Arbeit (dank der "verzögerten Erweiterung") mit allen Arten der Suche hier und da zu beenden. Hoffe, es hilft anderen BAT-Neulingen wie mir.

Jeffrey Zhao
quelle
0

Ich hatte nicht viel Glück mit den anderen Antworten, habe ich endlich herausgefunden, wie dies in meiner Implementierung zu tun , indem die eingebaute mit Befehl „Löschen“ , anscheinend gibt es eine bestimmte Art und Weise müssen Sie Platzhalter implementieren , es ist etwas nuanciert , ist hier Alles, was Sie in Ihr "CSPROJ" ( TargetDir ist eine integrierte Variable, die automatisch aufgenommen wird) unter dem Tag "Project" einfügen müssen:

<Target Name="RemoveFilesAfterBuild">   
    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>

Ich hatte auch Probleme mit der Generierung verschiedener sprachspezifischer Ordner. Wenn Sie dieses Problem ebenfalls haben, können Sie auch nicht verwendete sprachspezifische Ordner entfernen. Ich habe mich entschieden, dies nur unter dem Build-Typ "Release" auszulösen:

<ItemGroup>
    <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
        <InProject>false</InProject>
    </FluentValidationExcludedCultures> 
</ItemGroup>

<Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />

    <ItemGroup>
        <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
        <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
    </ItemGroup>
    <Delete Files="@(XMLFilesToDelete)" />
    <Delete Files="@(PDBFilesToDelete)" />
</Target>
David Rogers
quelle
-3

Wenn Sie nur die XML-Dateien ausschließen möchten (z. B. eine Debug-Version), können Sie Folgendes tun:

<AllowedReferenceRelatedFileExtensions>
  <!-- Prevent default XML from debug release  -->
      *.xml
 </AllowedReferenceRelatedFileExtensions>

Grundsätzlich wird jede aufgelistete Erweiterung (durch ein Semikolon getrennt) ausgeschlossen.

ProVega
quelle
1
Diese Frage und ihre akzeptierte Antwort sind 4 Jahre alt, und Ihre Antwort ist fast eine Kopie der akzeptierten Antwort.
Zack
1
Was anders ist, ist die Syntax nur für XML-Dateien, die ich brauchte. Ich musste nach der richtigen Syntax dieses Tags suchen. Ich fand die ursprüngliche Antwort hilfreich und stimmte sie ab, dachte aber, ich könnte jemand anderem Zeit sparen, wenn er nur einen bestimmten Dateityp filtern müsste.
ProVega
11
Aber wird dies nicht die XML-Dateien einschließen , nicht ausschließen?
David Gardiner