Предотвратяване на PDB и XML файлове с препратки към сглобка, копирани в изход

Имам проект на Visual Studio 2008 C#/.NET 3.5 със задача след компилация за ZIP съдържанието. Откривам обаче, че също получавам .pdb (отстраняване на грешки) и .xml (документация) файлове на посочените сглобки в моята изходна директория (и ZIP).

Например, ако MyProject.csproj препраща към YourAssembly.dll и има файлове YourAssembly.xml и YourAssembly.pdb в същата директория като DLL, те ще се покажат в моята изходна директория (и ZIP).

Мога да изключа *.pdb, когато архивирам, но не мога да изключа напълно *.xml файловете, тъй като имам файлове за внедряване със същото разширение.

Има ли начин да се попречи на проекта да копира PDB и XML файлове на референтно сглобяване?


person Jason Morse    schedule 06.01.2010    source източник
comment
@HenrikHolmgaardHøyer този въпрос задава точно обратното на вашия възможен дубликат   -  person Gaspa79    schedule 27.10.2020


Отговори (8)


Можете също да посочите това чрез командния ред:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
person mwjackson    schedule 06.01.2012
comment
Това изглежда като правилния начин, защото можете просто да го включите в аргументите на вашата дефиниция на MSBuild и да не се налага да хакнете csproj файлове. - person The Muffin Man; 08.04.2015
comment
Това работи чудесно от TFS и спестява необходимостта от модифициране на стотици проекти в моя случай - person ste-fu; 01.06.2016
comment
Също така работи чудесно с компилации в стил TFS2018 и не-XAML. - person knipp; 11.10.2018
comment
чисто и бързо решение. Благодаря - person Karan; 05.12.2018

Исках да мога да добавям и премахвам референтни модули в моето основно приложение, като същевременно избягвам необходимостта да поддържам кои файлове трябва да изтрия или изключа.

Разрових Microsoft.Common.targets в търсене на нещо, което да работи, и открих свойството AllowedReferenceRelatedFileExtensions. По подразбиране е .pdb; .xml, така че изрично го дефинирах в моя проектен файл. Уловката е, че имате нужда от нещо (празното пространство не е достатъчно), в противен случай пак ще използва стойността по подразбиране.

<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>
person Jason Morse    schedule 19.02.2010
comment
Това може да е правилният начин, но е толкова скрит, което е лошо в моите книги. - person Mladen Mihajlovic; 09.12.2015
comment
Това работи при изграждане от Visual Studio IDE. Въпреки това, не работи за мен при изграждане чрез MSBuild. Не би трябвало да го посочвам като /p опция, ако е във файла на проекта. - person redcurry; 20.04.2018
comment
За всеки, който не е запознат със задкулисието на VS проект. Ето едно хубаво ръководство стъпка по стъпка.kitsula.com/ Статия/Как-да-изключите-xml-doc-файлове-от-msbuild - person Reahreic; 09.02.2021

Можете да добавите команда за събитие след изграждане, подобна на del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

person AndrewJacksonZA    schedule 06.01.2010
comment
Благодаря. Това работи, ако имате статичен списък с референтни сборки. В нашия случай обаче имахме над две дузини, като много от тях се променяха, докато рефакторирахме. - person Jason Morse; 20.02.2010
comment
Лично аз смятам, че това е правилният отговор - другият начин е да хакнете файла на проекта и някой друг (или вие години по-късно) няма да знае къде да търси, за да види, че това е предотвратено. - person Mladen Mihajlovic; 09.12.2015
comment
И аз предпочитам този начин. Харесва ми да оставя всичко, което трябва да се случи (или е било предназначено да се случи на първо място), да завърши и след това да оставя събитията за изграждане на публикацията да го направят така, както го искам накрая. Просто изглежда много по-чисто по този начин! - person Arvo Bowen; 04.12.2016
comment
Въпреки че това решение работи, то не е наистина оптимизирано, тъй като губите време, копирайки нещо, което ще изтриете. Също така винаги съм смятал стъпките преди/след изграждането за хакове, тъй като те не работят толкова добре в система за изграждане, колкото целите или proj файловете. - person christ.s; 15.01.2020
comment
Уау @christ.s , *смях * Надявам се, че през десетте години, откакто отговорих на този въпрос, екипът на Visual Studio ще направи това по-лесно. :-) - person AndrewJacksonZA; 20.01.2020

Това е доста стар въпрос, но тъй като няма отговор за това как да се изключи генерирането на PDB и XML файлове чрез UI, реших, че трябва да е тук за пълнота.

В Visual Studio 2013: в свойствата на проекта, в раздела за компилиране, премахнете отметката от "Генериране на файл с XML документация", след това щракнете върху "Разширени опции за компилиране" под това и променете "Генериране на информация за отстраняване на грешки" на "Няма" и това ще свърши работа.

person Dingo    schedule 13.04.2015
comment
Това няма да повлияе на пакетите nuget, които включвате, те все още ще имат pdb и xml файлове. - person user692942; 29.10.2015
comment
Използвам свойства на OctoPack в моя csproj файл и това свърши работа за моите PDB и XML файлове. Също така използвах VS 2015. Build -› Advanced под Output -› задайте Debug Info на none под Output - person Devin Prejean; 27.03.2017

първите 2 отговора не ми помогнаха. Намерих решение в тази връзка, което работи за мен. http://kitsula.com/Article/How-to-exclude-xml-doc-files-from-msbuild.

За всеки случай връзката по-горе не работи:

  1. Разтоварване на проекта в Solution Explorer

  2. Щракнете с десния бутон върху проекта и щракнете върху „редактиране на *.csproj“

  3. Добавете следващите редове в секцията PropertyGroup на всяка среда.

  4. Презаредете и изградете отново проекта.

     <AllowedReferenceRelatedFileExtensions>
              *.pdb;
              *.xml
     </AllowedReferenceRelatedFileExtensions>
    
person Vasanth8891    schedule 14.10.2020

Нямах много късмет с другите отговори, най-накрая разбрах как да направя това в моята реализация, като използвам вградения Команда "Изтриване", очевидно има конкретен начин, по който трябва да имплементирайте заместващи символи, това е малко нюанси, ето всичко, от което се нуждаете, за да бъде поставено във вашия „CSPROJ“ (TargetDir е вградена променлива, включена автоматично) под етикета "Проект":

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

Също така имах проблеми с генерирането на различни специфични за език папки, ако и вие имате този проблем, можете също да премахнете неизползваните папки за специфичен език. Избрах да задействам това само под типа компилация „Издаване“:

<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>
person David Rogers    schedule 11.03.2019

Отговорът ми може да е тривиален сега, но бих искал да споделя BAT скрипта, който използвам за изтриване на xml файловете, ако има съответна dll за него. Полезно е, ако просто искате да почистите изходната папка и имате други xml файлове, които не искате да премахнете.

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

Употреба:

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

Отне ми един час, за да завърша тази проста работа (благодарение на нещата със „забавеното разширяване“) с всякакви търсения тук и там. Надявам се да помогне на други начинаещи BAT като мен.

person Jeffrey Zhao    schedule 30.01.2019

Ако искате да изключите само XML файловете (например версия за отстраняване на грешки), можете да направите нещо подобно:

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

По принцип всяко изброено разширение (разделено с точка и запетая) ще бъде изключено.

person ProVega    schedule 08.01.2014
comment
Този въпрос и неговият приет отговор са отпреди 4 години и вашият отговор е почти копие-поставяне на приетия отговор. - person Zack; 16.10.2015
comment
Това, което е различно, е синтаксисът само за XML файлове, което е това, от което имах нужда. Трябваше да направя някои изследвания за правилния синтаксис на този етикет. Намерих оригиналния отговор за полезен и гласувах за него, но реших, че мога да спестя време на някой друг, ако просто трябва да филтрира конкретен тип файл. - person ProVega; 17.10.2015
comment
Но това няма ли да включи xml файловете, а не да ги изключи? - person David Gardiner; 18.05.2016