Prevención de la copia de archivos XML y PDB de ensamblado referenciados en la salida

118

Tengo un proyecto de Visual Studio 2008 C # / .NET 3.5 con una tarea de compilación posterior para comprimir el contenido. Sin embargo, descubro que también obtengo los archivos .pdb (depuración) y .xml (documentación) de los ensamblajes referenciados en mi directorio de salida (y ZIP).

Por ejemplo, si MyProject.csproj hace referencia a YourAssembly.dll y hay archivos YourAssembly.xml y YourAssembly.pdb en el mismo directorio que la DLL, aparecerán en mi directorio de salida (y ZIP).

Puedo excluir * .pdb al hacer ZIP, pero no puedo excluir los archivos * .xml porque tengo archivos de implementación con la misma extensión.

¿Hay alguna manera de evitar que el proyecto copie archivos ensamblados PDB y XML referenciados?

Jason Morse
fuente

Respuestas:

68

También puede especificar esto a través de la línea de comando:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
fuente
9
Este parece el camino a seguir porque puede incluirlo en los argumentos de MSBuild de la definición de compilación y no tener que cortar los archivos csproj.
The Muffin Man
2
Esto funciona muy bien desde TFS y ahorra tener que modificar cientos de proyectos en mi caso
ste-fu
También funciona muy bien con compilaciones de estilo TFS2018 y no XAML.
knipp
Solución ordenada y rápida. Gracias
Karan
158

Quería poder agregar y eliminar ensamblajes referenciados en mi aplicación principal mientras evitaba la necesidad de mantener los archivos que necesitaba eliminar o excluir.

Busqué Microsoft.Common.targetsalgo que funcionara y encontré la AllowedReferenceRelatedFileExtensionspropiedad. Por defecto, .pdb; .xmllo definí explícitamente en mi archivo de proyecto. El problema es que necesitas algo (el espacio en blanco no es suficiente), de lo contrario, seguirá usando el predeterminado.

<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
fuente
3
Esta podría ser la forma "correcta", pero está tan oculta que es mala en mis libros.
Mladen Mihajlovic
1
Esto funcionó al compilar desde el IDE de Visual Studio. Sin embargo, no funcionó para mí cuando construí a través de MSBuild. No debería necesitar especificarlo como una opción / p si está en el archivo del proyecto.
curry
19

Puede agregar un comando de evento posterior a la compilación similar a del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
fuente
Gracias. Esto funciona si tiene una lista estática de ensamblados referenciados. En nuestro caso, sin embargo, teníamos más de dos docenas, y muchas de ellas cambiaban mientras refactorizábamos.
Jason Morse
4
Personalmente, creo que esta es la respuesta correcta: de otra manera, usted está pirateando el archivo del proyecto y nadie más (o usted mismo años después) no sabría dónde buscar para evitar que esto se evite.
Mladen Mihajlovic
1
Yo también prefiero esta forma. Me gusta dejar que todo lo que sea necesario que suceda (o que fue diseñado para suceder en primer lugar) termine y luego dejar que los eventos de compilación posteriores lo hagan como yo quiero al final. ¡Parece mucho más limpio de esta manera!
Arvo Bowen
Aunque esta solución funciona, no está realmente optimizada ya que pierde tiempo copiando algo que eliminará. También siempre he considerado los pasos previos / posteriores a la compilación como trucos, ya que no funcionan tan bien en un sistema de compilación como los objetivos o los archivos de proyecto.
christ.s
Wow @ christ.s, * risita * Espero que en los diez años transcurridos desde que respondí esta pregunta, el equipo de Visual Studio lo hubiera hecho más fácil. :-)
AndrewJacksonZA
5

Esta es una pregunta bastante antigua, pero como no hay respuesta sobre cómo desactivar la generación de archivos PDB y XML a través de la interfaz de usuario, pensé que debería estar aquí para completar.

En Visual Studio 2013: en las propiedades del proyecto, en la pestaña de compilación, desmarque "Generar archivo de documentación XML", luego haga clic en "Opciones de compilación avanzadas" debajo de eso y cambie "Generar información de depuración" a "Ninguno", y eso hará el truco.

Dingo
fuente
15
Eso no afectará a los paquetes nuget que incluya que todavía tendrán pdby xmlarchivos.
Lankymart
Estoy usando las propiedades de OctoPack en mi archivo csproj y esto funcionó para mis archivos PDB y XML. También estaba usando VS 2015. Construir -> Avanzado en Salida -> establecer Información de depuración en ninguno en Salida
Devin Prejean
0

Mi respuesta puede ser trivial ahora, pero me gustaría compartir el script BAT que uso para eliminar los archivos xml si hay un dll correspondiente. Es útil si solo desea limpiar la carpeta de salida y tiene otros archivos xml que no desea eliminar.

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\

Me tomó una hora terminar este sencillo trabajo (gracias a la "expansión retrasada") con todo tipo de búsquedas aquí y allá. Espero que ayude a otros novatos de BAT como yo.

Jeffrey Zhao
fuente
0

No tuve mucha suerte con las otras respuestas, finalmente descubrí cómo hacer esto en mi implementación usando el comando "Eliminar" integrado , aparentemente hay una forma específica en la que necesita implementar comodines , tiene algunos matices , aquí está todo lo que necesita poner en su "CSPROJ" ( TargetDir es una variable incorporada, incluida automáticamente) bajo la etiqueta "Proyecto":

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

También he tenido problemas con la generación de varias carpetas específicas de idiomas, si también tiene ese problema, también puede eliminar las carpetas específicas de idiomas no utilizadas. Elegí activar esto solo bajo el tipo de compilación "Lanzamiento":

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

Si solo desea excluir los archivos XML (por ejemplo, una versión de depuración), puede hacer algo como esto:

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

Básicamente, se excluirá cada extensión (delimitada por un punto y coma) listada.

ProVega
fuente
1
Esta pregunta y su respuesta aceptada tienen 4 años, y su respuesta es casi una copia y pegado de la respuesta aceptada.
Zack
1
Lo que es diferente es la sintaxis solo para archivos XML, que es lo que necesitaba. Tuve que investigar un poco la sintaxis adecuada de esta etiqueta. Encontré la respuesta original útil y la voté, pero pensé que podría ahorrarle tiempo a otra persona si solo necesitara filtrar un tipo de archivo específico.
ProVega
11
¿Pero esto no incluirá los archivos xml, no los excluirá?
David Gardiner