Evitar arquivos PDB e XML de montagem referenciados copiados para a saída

118

Eu tenho um projeto Visual Studio 2008 C # / .net 3.5 com uma tarefa de pós-compilação para compactar o conteúdo. No entanto, estou descobrindo que também estou obtendo os arquivos .pdb (depuração) e .xml (documentação) dos assemblies referenciados em meu diretório de saída (e ZIP).

Por exemplo, se MyProject.csproj fizer referência a YourAssembly.dll e houver os arquivos YourAssembly.xml e YourAssembly.pdb no mesmo diretório da DLL, eles aparecerão em meu diretório de saída (e ZIP).

Posso excluir * .pdb ao compactar, mas não posso excluir os arquivos * .xml, pois tenho arquivos de implantação com a mesma extensão.

Existe uma maneira de impedir que o projeto copie os arquivos PDB e XML do assembly referenciado?

Jason Morse
fonte

Respostas:

68

Você também pode especificar isso por meio da linha de comando:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
fonte
9
Este parece ser o caminho a seguir porque você pode simplesmente incluí-lo em seus argumentos MSBuild de definição de compilação e não ter que invadir os arquivos csproj.
The Muffin Man
2
Isso funciona muito bem no TFS e evita a necessidade de modificar centenas de projetos no meu caso
ste-fu
Também funciona muito bem com compilações de estilo TFS2018 e não XAML.
knipp de
solução limpa e rápida. Obrigado
Karan
158

Eu queria ser capaz de adicionar e remover assemblies referenciados em meu aplicativo principal, evitando a necessidade de manter quais arquivos eu precisava excluir ou excluir.

Eu cavei Microsoft.Common.targetsprocurando por algo que funcionasse e encontrei a AllowedReferenceRelatedFileExtensionspropriedade. O padrão é .pdb; .xmlentão eu o defini explicitamente em meu arquivo de projeto. O problema é que você precisa de algo (espaços em branco não são suficientes), caso contrário, o padrão ainda será usado.

<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
fonte
3
Esta pode ser a forma "correta", mas está tão escondida que é ruim em meus livros.
Mladen Mihajlovic
1
Isso funcionou ao compilar a partir do IDE do Visual Studio. No entanto, não funcionou para mim ao compilar via MSBuild. Não devo precisar especificá-lo como uma opção / p se estiver no arquivo de projeto.
redcurry
19

Você pode adicionar um comando de evento Post Build semelhante a del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
fonte
Obrigado. Isso funciona se você tiver uma lista estática de assemblies referenciados. No nosso caso, entretanto, tínhamos mais de duas dúzias, com muitos deles em fluxo enquanto refatorávamos.
Jason Morse
4
Pessoalmente, acho que esta é a resposta correta - a outra maneira é você hackear o arquivo do projeto e qualquer outra pessoa (ou você mesmo anos depois) não saberia onde olhar para ver isso sendo evitado.
Mladen Mihajlovic
1
Eu prefiro assim também. Gosto de deixar que tudo o que precisa acontecer (ou foi projetado para acontecer em primeiro lugar) termine e, em seguida, deixar os eventos de pós-compilação fazerem como eu quero no final. Parece muito mais limpo assim!
Arvo Bowen
Mesmo que essa solução funcione, ela não é realmente otimizada, pois você perde tempo copiando algo que excluirá. Eu também sempre considerei as etapas de pré / pós-compilação como hacks, uma vez que não funcionam tão bem em um sistema de compilação do que os arquivos de destino ou proj.
Cristo
Wow @ christ.s, * risos * Espero que nos dez anos desde que respondi a essa pergunta a equipe do Visual Studio tenha tornado isso mais fácil. :-)
AndrewJacksonZA
5

Esta é uma pergunta bastante antiga, mas como não há resposta sobre como desativar a geração de arquivos PDB e XML por meio da interface do usuário, imaginei que ela deveria estar aqui para ser completa.

No Visual Studio 2013: nas propriedades do projeto, na guia compilar, desmarque "Gerar arquivo de documentação XML", clique em "Opções avançadas de compilação" abaixo e altere "Gerar informações de depuração" para "Nenhum" e isso resolverá o problema.

Dingo
fonte
15
Isso não afetará os pacotes nuget incluídos, eles ainda terão pdbe xmlarquivos.
Lankymart
Estou usando as propriedades OctoPack em meu arquivo csproj e isso funcionou para meus arquivos PDB e XML. Eu também estava usando o VS 2015. Build -> Advanced em Output -> definir Debug Info como none em Output
Devin Prejean
0

Minha resposta pode ser trivial agora, mas gostaria de compartilhar o script BAT que uso para excluir os arquivos xml, se houver uma dll correspondente para ele. É útil se você deseja apenas limpar a pasta de saída e tem outros arquivos xml que não deseja remover.

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\

Levei uma hora para terminar esse trabalho simples (graças ao material de "expansão atrasada") com todo tipo de busca aqui e ali. Espero que ajude outros novatos BAT como eu.

Jeffrey Zhao
fonte
0

Não tive muita sorte com as outras respostas, finalmente descobri como fazer isso na minha implementação usando o comando "Excluir" embutido , aparentemente há uma maneira específica de implementar curingas , é um pouco matizada , aqui está tudo que você precisa ser colocado em seu "CSPROJ" ( TargetDir é uma variável embutida, incluída automaticamente) sob a tag "Projeto":

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

Também tive problemas com a geração de várias pastas específicas de um idioma. Se você também tiver esse problema, também poderá remover as pastas não utilizadas de um idioma específico. Eu escolhi acionar isso apenas no tipo de construção "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
fonte
-3

Se você deseja apenas excluir os arquivos XML (por exemplo, uma versão de depuração), pode fazer algo assim:

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

Basicamente, cada extensão (delimitada por um ponto e vírgula) listada será excluída.

ProVega
fonte
1
Esta pergunta e sua resposta aceita têm 4 anos, e sua resposta é quase um copiar e colar da resposta aceita.
Zack de
1
O que é diferente é a sintaxe apenas para arquivos XML, que é o que eu precisava. Eu tive que fazer algumas pesquisas para a sintaxe adequada desta tag. Achei a resposta original útil e votei positivamente, mas descobri que poderia economizar algum tempo de outra pessoa se ela apenas precisasse filtrar um tipo de arquivo específico.
ProVega de
11
Mas isso não incluirá os arquivos xml, não os excluirá?
David Gardiner