Impedire la copia nell'output dei file PDB e XML dell'assembly di riferimento


118

Ho un progetto Visual Studio 2008 C # /. NET 3.5 con un'attività di post compilazione per comprimere il contenuto. Tuttavia sto scoprendo che sto anche ottenendo i file .pdb (debug) e .xml (documentazione) degli assembly di riferimento nella mia directory di output (e ZIP).

Ad esempio, se MyProject.csproj fa riferimento a YourAssembly.dll e sono presenti file YourAssembly.xml e YourAssembly.pdb nella stessa directory della DLL, verranno visualizzati nella mia directory di output (e ZIP).

Posso escludere * .pdb durante lo ZIP, ma non posso escludere i file * .xml poiché ho file di distribuzione con la stessa estensione.

Esiste un modo per impedire al progetto di copiare file PDB e XML dell'assembly di riferimento?

Risposte:


68

Puoi anche specificarlo tramite la riga di comando:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none

9
Questa sembra la strada da percorrere perché puoi semplicemente includerla nella definizione di build degli argomenti di MSBuild e non devi hackerare i file csproj.
The Muffin Man

2
Funziona alla grande da TFS e evita di dover modificare centinaia di progetti nel mio caso
ste-fu

Funziona perfettamente anche con TFS2018 e build in stile non XAML.
knipp

soluzione pulita e veloce. Grazie
Karan

158

Volevo essere in grado di aggiungere e rimuovere assembly di riferimento nella mia applicazione principale evitando la necessità di mantenere i file che dovevo eliminare o escludere.

Ho Microsoft.Common.targetscercato qualcosa che funzionasse e ho trovato la AllowedReferenceRelatedFileExtensionsproprietà. Il valore predefinito è .pdb; .xmlquindi l'ho definito esplicitamente nel mio file di progetto. Il problema è che hai bisogno di qualcosa (gli spazi non sono sufficienti) altrimenti userà ancora l'impostazione predefinita.

<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>

3
Questo potrebbe essere il modo "corretto", ma è così nascosto che è un male nei miei libri.
Mladen Mihajlovic

1
Ha funzionato durante la compilazione dall'IDE di Visual Studio. Tuttavia, non ha funzionato per me durante la compilazione tramite MSBuild. Non dovrei aver bisogno di specificarlo come opzione / p se è nel file di progetto.
redcurry

19

Puoi aggiungere un comando dell'evento di post-compilazione simile a del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


Grazie. Funziona se si dispone di un elenco statico di assembly di riferimento. Nel nostro caso, tuttavia, ne abbiamo avuti più di due dozzine, con molti di loro in continuo cambiamento durante il refactoring.
Jason Morse

4
Personalmente penso che questa sia la risposta corretta: l'altro modo ti ha fatto hackerare il file di progetto e chiunque altro (o te stesso anni dopo) non saprebbe dove cercare per vedere che questo viene impedito.
Mladen Mihajlovic

1
Anch'io preferisco così. Mi piace lasciare che tutto ciò che deve accadere (o è stato progettato per accadere in primo luogo) finisca e poi lasciare che il post costruire eventi lo faccia come lo voglio io alla fine. Sembra molto più pulito in questo modo!
Arvo Bowen

Anche se questa soluzione funziona, non è davvero ottimizzata poiché perdi tempo a copiare qualcosa che elimini. Ho anche sempre considerato i passaggi pre / post build come hack poiché non funzionano bene in un sistema di build rispetto a target o file proj.
christ.

Wow @ christ.s, * ridacchia * Spero che nei dieci anni trascorsi da quando ho risposto a questa domanda il team di Visual Studio avrebbe reso tutto più semplice. :-)
AndrewJacksonZA

5

Questa è una domanda piuttosto vecchia, ma poiché non esiste una risposta su come disattivare la generazione di file PDB e XML tramite l'interfaccia utente, ho pensato che dovrebbe essere qui per completezza.

In Visual Studio 2013: nelle proprietà del progetto, nella scheda Compila, deseleziona "Genera file di documentazione XML", quindi fai clic su "Opzioni di compilazione avanzate" sotto e cambia "Genera informazioni di debug" su "Nessuno", e questo farà il trucco.


15
Ciò non avrà effetto sui pacchetti nuget che includi che avranno ancora pdbe xmlfile.
Lankymart

Sto usando le proprietà OctoPack nel mio file csproj e questo ha funzionato con i miei file PDB e XML. Stavo anche usando VS 2015. Build -> Advanced in Output -> imposta Debug Info su none in Output
Devin Prejean

0

La mia risposta potrebbe essere banale ora, ma mi piacerebbe condividere lo script BAT che uso per eliminare i file xml se c'è una dll corrispondente. È utile se vuoi solo pulire la cartella di output e hai altri file xml che non vuoi rimuovere.

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!"
  )
)

Uso:

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

Mi ci è voluta un'ora per finire questo semplice lavoro (grazie alla roba di "espansione ritardata") con ogni tipo di ricerca qua e là. Spero che aiuti altri principianti di BAT come me.


0

Non ho avuto molta fortuna con le altre risposte, ho finalmente capito come farlo nella mia implementazione usando il comando "Elimina" integrato , apparentemente c'è un modo specifico in cui devi implementare i caratteri jolly , è un po 'sfumato , ecco tutto ciò di cui hai bisogno deve essere inserito nel tuo "CSPROJ" ( TargetDir è una variabile incorporata, inclusa automaticamente) sotto il tag "Project":

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

Ho anche avuto problemi con la generazione di cartelle specifiche di varie lingue, se hai anche questo problema, puoi anche rimuovere anche cartelle specifiche della lingua inutilizzate. Ho scelto di attivarlo solo con il tipo di build "Release":

<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>

-3

Se vuoi escludere solo i file XML (per esempio una versione di debug) puoi fare qualcosa del genere:

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

Fondamentalmente, ogni estensione (delimitata da un punto e virgola) elencata verrà esclusa.


1
Questa domanda e la sua risposta accettata hanno 4 anni e la tua risposta è quasi un copia-incolla della risposta accettata.
Zack

1
Ciò che è diverso è la sintassi solo per i file XML che è ciò di cui avevo bisogno. Ho dovuto fare qualche ricerca per la corretta sintassi di questo tag. Ho trovato utile la risposta originale e l'ho votata, ma ho pensato che avrei potuto risparmiare un po 'di tempo a qualcun altro se avesse solo bisogno di filtrare un tipo di file specifico.
ProVega

11
Ma questo non includerà i file xml, non lo escluderà?
David Gardiner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.