Zapobieganie kopiowaniu plików PDB i XML do zestawów, do których istnieją odniesienia

118

Mam projekt Visual Studio 2008 C # / .NET 3.5 z zadaniem po kompilacji, aby spakować zawartość. Jednak stwierdzam, że otrzymuję również pliki pdb (debugowanie) i .xml (dokumentacja), do których istnieją odwołania, w moim katalogu wyjściowym (i ZIP).

Na przykład, jeśli MyProject.csproj odwołuje się do YourAssembly.dll i istnieją pliki YourAssembly.xml i YourAssembly.pdb w tym samym katalogu co biblioteka DLL, pojawią się one w moim katalogu wyjściowym (i ZIP).

Mogę wykluczyć * .pdb podczas archiwizacji, ale nie mogę wykluczyć plików * .xml, ponieważ mam pliki wdrożeniowe o tym samym rozszerzeniu.

Czy istnieje sposób, aby uniemożliwić projektowi kopiowanie plików PDB i XML do zestawów, do których istnieją odwołania?

Jason Morse
źródło

Odpowiedzi:

68

Możesz to również określić za pomocą wiersza poleceń:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
źródło
9
Wygląda na to, że należy to zrobić, ponieważ możesz po prostu uwzględnić go w argumentach MSBuild definicji kompilacji i nie musisz hakować plików csproj.
The Muffin Man
2
Działa to świetnie z TFS i oszczędza konieczności modyfikowania setek projektów w moim przypadku
ste-fu
Działa również świetnie z kompilacjami w stylu TFS2018 i innymi niż XAML.
knipp
schludne i szybkie rozwiązanie. Dzięki
Karan
158

Chciałem mieć możliwość dodawania i usuwania zestawów, do których istnieją odwołania, w mojej aplikacji podstawowej, unikając konieczności utrzymywania plików, które muszę usunąć lub wykluczyć.

Przekopałem się, Microsoft.Common.targetsszukając czegoś, co działałoby i znalazłem AllowedReferenceRelatedFileExtensionsnieruchomość. Domyślnie jest .pdb; .xmltak, więc jawnie zdefiniowałem go w pliku projektu. Haczyk polega na tym, że potrzebujesz czegoś (białe znaki nie są wystarczające), w przeciwnym razie nadal będzie używać wartości domyślnej.

<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
źródło
3
To może być „poprawny” sposób, ale jest tak ukryty, co jest złe w moich książkach.
Mladen Mihajlovic,
1
To zadziałało podczas tworzenia z programu Visual Studio IDE. Jednak nie działało to dla mnie podczas kompilowania za pośrednictwem programu MSBuild. Nie muszę określać tego jako opcji / p, jeśli jest w pliku projektu.
redcurry
19

Możesz dodać polecenie zdarzenia po kompilacji podobne do del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

AndrewJacksonZA
źródło
Dzięki. Działa to, jeśli masz statyczną listę zestawów, do których istnieją odwołania. W naszym przypadku mieliśmy jednak ponad dwa tuziny, a wiele z nich uległo zmianie podczas refaktoryzacji.
Jason Morse
4
Osobiście uważam, że to poprawna odpowiedź - w inny sposób włamujesz się do pliku projektu i nikt inny (lub Ty po latach) nie będzie wiedział, gdzie szukać, aby temu zapobiec.
Mladen Mihajlovic,
1
Ja też wolę ten sposób. Lubię pozwalać, aby wszystko, co musi się wydarzyć (lub zostało zaprojektowane tak, aby się wydarzyło w pierwszej kolejności) zakończyło się, a następnie pozwól, aby wydarzenia po kompilacji sprawiły, że w końcu tego chcę. W ten sposób wydaje się o wiele czystszy!
Arvo Bowen
Nawet jeśli to rozwiązanie działa, nie jest tak naprawdę zoptymalizowane, ponieważ tracisz czas na kopiowanie czegoś, co usuniesz. Zawsze uważałem również kroki przed / po kompilacji za hacki, ponieważ nie działają one tak dobrze w systemie kompilacji niż cele lub pliki proj.
chrystus.
Wow @ christ.s, * chuckle * Mam nadzieję, że w ciągu dziesięciu lat, odkąd odpowiedziałem na to pytanie, zespół Visual Studio ułatwi to zadanie. :-)
AndrewJacksonZA
5

To dość stare pytanie, ale ponieważ nie ma odpowiedzi na temat tego, jak wyłączyć generowanie plików PDB i XML za pośrednictwem interfejsu użytkownika, doszedłem do wniosku, że powinno to być tutaj dla kompletności.

W programie Visual Studio 2013: we właściwościach projektu, na karcie kompiluj, odznacz „Generuj plik dokumentacji XML”, a następnie kliknij „Zaawansowane opcje kompilacji” poniżej i zmień „Generuj informacje debugowania” na „Brak”, a to załatwi sprawę.

Dingo
źródło
15
Nie wpłynie to na żadne dołączone pakiety nuget, które nadal będą miały pdbi xmlpliki.
Lankymart
Używam właściwości OctoPack w moim pliku csproj i to załatwiło sprawę dla moich plików PDB i XML. Używałem także VS 2015. Build -> Advanced w Output -> set Debug Info na none w Output
Devin Prejean
0

Moja odpowiedź może być teraz banalna, ale chciałbym udostępnić skrypt BAT, którego używam do usuwania plików xml, jeśli jest dla niego odpowiednia biblioteka dll. Jest to przydatne, jeśli chcesz tylko wyczyścić folder wyjściowy i masz inne pliki xml, których nie chcesz usuwać.

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

Stosowanie:

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

Zajęło mi godzinę, aby ukończyć tę prostą pracę (dzięki "opóźnionej ekspansji") z wszelkiego rodzaju poszukiwaniami tu i tam. Mam nadzieję, że pomoże to innym nowicjuszom BAT, takim jak ja.

Jeffrey Zhao
źródło
0

Nie miałem szczęścia z innymi odpowiedziami, w końcu zorientowałem się, jak to zrobić w mojej implementacji, używając wbudowanego polecenia „Usuń” , najwyraźniej jest określony sposób, w jaki musisz zaimplementować symbole wieloznaczne , jest nieco zniuansowany , oto wszystko, co musisz umieścić w swoim „CSPROJ” ( TargetDir to zmienna wbudowana, dołączana automatycznie) pod tagiem „Projekt”:

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

Miałem również problemy z generowaniem różnych folderów specyficznych dla języka, jeśli masz ten problem, możesz również usunąć nieużywane foldery specyficzne dla języka. Zdecydowałem się wywołać to tylko dla typu kompilacji „Wydanie”:

<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
źródło
-3

Jeśli chcesz tylko wykluczyć pliki XML (na przykład wydanie debugowania), możesz zrobić coś takiego:

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

Zasadniczo każde wymienione rozszerzenie (oddzielone średnikiem) będzie wykluczone.

ProVega
źródło
1
To pytanie i zaakceptowana odpowiedź mają już 4 lata, a Twoja odpowiedź jest prawie kopiowaniem i wklejaniem zaakceptowanej odpowiedzi.
Zack
1
Różnica polega na składni samych plików XML, której potrzebowałem. Musiałem poszukać poprawnej składni tego tagu. Oryginalna odpowiedź okazała się pomocna i przegłosowałem ją, ale pomyślałem, że mógłbym zaoszczędzić trochę czasu komuś innemu, gdyby tylko musiał przefiltrować określony typ pliku.
ProVega,
11
Ale czy nie obejmie to plików xml, a nie wykluczy?
David Gardiner