Empêcher la copie des fichiers PDB et XML d'assembly référencés dans la sortie

118

J'ai un projet Visual Studio 2008 C # / .NET 3.5 avec une tâche de post-génération pour compresser le contenu. Cependant, je trouve que je reçois également les fichiers .pdb (débogage) et .xml (documentation) des assemblys référencés dans mon répertoire de sortie (et ZIP).

Par exemple, si MyProject.csproj fait référence à YourAssembly.dll et qu'il y a des fichiers YourAssembly.xml et YourAssembly.pdb dans le même répertoire que la DLL, ils apparaîtront dans mon répertoire de sortie (et ZIP).

Je peux exclure * .pdb lors du ZIP mais je ne peux pas exclure les fichiers * .xml car j'ai des fichiers de déploiement avec la même extension.

Existe-t-il un moyen d'empêcher le projet de copier les fichiers PDB et XML d'assembly référencés?

Jason Morse
la source

Réponses:

68

Vous pouvez également le spécifier via la ligne de commande:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
la source
9
Cela ressemble à la voie à suivre car vous pouvez simplement l'inclure dans vos arguments MSBuild de définition de construction et ne pas avoir à pirater les fichiers csproj.
The Muffin Man
2
Cela fonctionne très bien à partir de TFS et évite d'avoir à modifier des centaines de projets dans mon cas
ste-fu
Fonctionne également très bien avec les versions de style TFS2018 et non-XAML.
knipp
solution soignée et rapide. Merci
Karan
158

Je voulais pouvoir ajouter et supprimer des assemblys référencés dans mon application principale tout en évitant de devoir conserver les fichiers que je devais supprimer ou exclure.

J'ai fouillé à la Microsoft.Common.targetsrecherche de quelque chose qui fonctionnerait et j'ai trouvé la AllowedReferenceRelatedFileExtensionspropriété. Par défaut .pdb; .xml, je l'ai défini explicitement dans mon fichier de projet. Le hic, c'est que vous avez besoin de quelque chose (les espaces ne sont pas suffisants) sinon il utilisera toujours la valeur par défaut.

<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
la source
3
C'est peut-être la manière «correcte», mais c'est tellement caché, ce qui est mauvais dans mes livres.
Mladen Mihajlovic
1
Cela a fonctionné lors de la création à partir de l'IDE de Visual Studio. Cependant, cela n'a pas fonctionné pour moi lors de la construction via MSBuild. Je ne devrais pas avoir besoin de le spécifier comme option / p si c'est dans le fichier projet.
redcurry
19

Vous pouvez ajouter une commande d'événement Post Build similaire à del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
la source
Merci. Cela fonctionne si vous avez une liste statique d'assemblys référencés. Dans notre cas, cependant, nous en avons eu plus de deux douzaines, avec beaucoup d'entre eux en flux pendant que nous refactorions.
Jason Morse
4
Personnellement, je pense que c'est la bonne réponse - dans l'autre cas, vous avez piraté le fichier du projet et quiconque (ou vous-même des années plus tard) ne saurait pas où chercher pour voir cela empêché.
Mladen Mihajlovic
1
Je préfère aussi cette façon. J'aime laisser tout ce qui doit se produire (ou a été conçu pour se produire en premier lieu) se terminer, puis laisser les événements post-build le faire comme je le veux à la fin. Cela semble tellement plus propre de cette façon!
Arvo Bowen
Même si cette solution fonctionne, elle n'est pas vraiment optimisée car vous perdez du temps à copier quelque chose que vous supprimerez. J'ai également toujours considéré les étapes pré / post-build comme des hacks car elles ne fonctionnent pas aussi bien dans un système de build que les cibles ou les fichiers proj.
christ.s
Wow @ christ.s, * gloussement * J'espère que dans les dix ans depuis que j'ai répondu à cette question, l'équipe de Visual Studio aurait rendu cela plus facile. :-)
AndrewJacksonZA
5

C'est une question plutôt ancienne, mais comme il n'y a pas de réponse sur la façon de désactiver la génération de fichiers PDB et XML via l'interface utilisateur, j'ai pensé qu'elle devrait être ici pour être complète.

Dans Visual Studio 2013: dans les propriétés du projet, sous l'onglet de compilation, décochez «Générer un fichier de documentation XML», puis cliquez sur «Options de compilation avancées» ci-dessous et modifiez «Générer les informations de débogage» sur «Aucune», et cela fera l'affaire.

Dingo
la source
15
Cela n'affectera pas les packages nuget que vous incluez, ils auront toujours pdbet les xmlfichiers.
Lankymart
J'utilise les propriétés OctoPack dans mon fichier csproj et cela a fait l'affaire pour mes fichiers PDB et XML. J'utilisais également VS 2015. Build -> Advanced sous Output -> set Debug Info sur none sous Output
Devin Prejean
0

Ma réponse est peut-être triviale maintenant, mais j'aimerais partager le script BAT que j'utilise pour supprimer les fichiers xml s'il existe une DLL correspondante. C'est utile si vous souhaitez simplement nettoyer le dossier de sortie et que d'autres fichiers xml ne veulent pas être supprimés.

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

Usage:

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

Il m'a fallu une heure pour terminer ce travail simple (grâce au truc de "l'expansion retardée") avec tout type de recherche ici et là. J'espère que cela aidera d'autres débutants BAT comme moi.

Jeffrey Zhao
la source
0

Je n'ai pas eu beaucoup de chance avec les autres réponses, j'ai finalement compris comment faire cela dans mon implémentation en utilisant la commande intégrée "Supprimer" , apparemment il y a une manière spécifique dont vous avez besoin pour implémenter les jokers , c'est un peu nuancé , voici tout ce dont vous avez besoin pour être mis dans votre "CSPROJ" ( TargetDir est une variable intégrée, incluse automatiquement) sous la balise "Projet":

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

J'ai également eu des problèmes avec la génération de divers dossiers spécifiques à une langue.Si vous rencontrez également ce problème, vous pouvez également supprimer les dossiers spécifiques à une langue inutilisés. J'ai choisi de déclencher ceci uniquement sous le type de 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>
David Rogers
la source
-3

Si vous souhaitez uniquement exclure les fichiers XML (par exemple une version de débogage), vous pouvez faire quelque chose comme ceci:

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

Fondamentalement, chaque extension (délimitée par un point-virgule) répertoriée sera exclue.

ProVega
la source
1
Cette question et sa réponse acceptée datent de 4 ans, et votre réponse est presque un copier-coller de la réponse acceptée.
Zack
1
Ce qui est différent, c'est la syntaxe des fichiers XML uniquement, ce dont j'avais besoin. J'ai dû faire des recherches pour la syntaxe correcte de cette balise. J'ai trouvé la réponse originale utile et l'ai votée à la hausse, mais j'ai pensé que je pourrais faire gagner du temps à quelqu'un d'autre s'il avait juste besoin de filtrer un type de fichier spécifique.
ProVega
11
Mais cela n'inclura- t-il pas les fichiers xml, ne les exclura-t-il pas?
David Gardiner