Запобігання посиланням файлів PDB та XML, скопійованих на вихід


118

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

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

Я можу виключити * .pdb під час ZIP'ing, але я не можу покривати виключити файли * .xml, оскільки у мене є файли розгортання з тим же розширенням.

Чи є спосіб запобігти проекту копіювати файли PDB та XML з посиланням на нього?

Відповіді:


68

Ви також можете вказати це за допомогою командного рядка:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none

9
Це виглядає як шлях, тому що ви можете просто включити його в своє визначення аргументів MSBuild і не потрібно виламувати файли csproj.
— The Muffin Man

2
Це чудово працює від TFS і економить необхідність змінити 100 проектів у моєму випадку
— ste-fu

Також чудово працює з побудовами стилів TFS2018 та не-XAML.
— knopp

акуратне та швидке рішення. Спасибі
— Каран

158

Я хотів мати змогу додавати та видаляти посилання, що посилаються, у своїй основній програмі, уникаючи необхідності підтримувати, які файли мені потрібно видалити чи виключити.

Я перекопався, 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>

3
Це може бути "правильний" спосіб, але це так приховано, що погано в моїх книгах.
— Младен Михайлович

1
Це спрацювало під час побудови з Visual Studio IDE. Однак для мене це не спрацювало при будівництві через MSBuild. Мені не потрібно вказувати його як параметр / p, якщо він є у файлі проекту.
— червоний лук

19

Ви можете додати команду події Post Build подібно до del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"


Дякую. Це працює, якщо у вас є статичний перелік посилань. У нашому випадку, однак, у нас було понад два десятки, багато з них були в потоці, поки ми реконструювались.
— Джейсон Морс

4
Особисто я вважаю, що це правильна відповідь - іншим способом ви зломте файл проекту, і хтось інший (або ви самі через роки) не знатиме, куди шукати, щоб побачити, що це заважає.
— Младен Михайлович

1
Я вважаю за краще і цей спосіб. Мені подобається дозволити закінчити все, що потрібно (або було розроблено в першу чергу), а потім дозволити подіям будувати події так, як я цього хочу. Це просто здається набагато чистішим таким чином!
— Арво Боуен

Навіть це рішення працює, воно не дуже оптимізоване, оскільки ви втрачаєте час на копіювання того, що ви видалите. Я також завжди вважав кроки збирання до / після збирання хаками, оскільки вони не працюють так добре в системі збірки, ніж цілі або файли proj.
— christ.s

Wow @ christ.s, * chuckle * Я би сподівався, що за десять років, з тих пір, як я відповів на це запитання, команда Visual Studio зробить це легше. :-)
— AndrewJacksonZA

5

Це досить давнє запитання, але оскільки немає відповіді на те, як вимкнути генерування файлів PDB та XML через користувальницький інтерфейс, я подумав, що це повинно бути тут для повноти.

У Visual Studio 2013: у властивостях проекту на вкладці компіляції зніміть прапорець "Створити файл документації XML", потім натисніть "Розширені параметри компіляції" нижче цього та змініть "Створити інформацію про налагодження" на "Немає", і це зробить трюк.


15
Це не вплине на будь-який NuGet пакетів , які включають в себе вони будуть по- , як і раніше є pdbі xmlфайли.
— Ланкімарт

Я використовую властивості OctoPack у своєму файлі csproj, і це зробило трюк для моїх файлів PDB та XML. Я також використовував VS 2015. Збірка -> Додатково під висновком -> встановіть інформацію про налагодження у жодному під Output
— Devin Prejean

0

Моя відповідь може бути тривіальною зараз, але я хотів би поділитися сценарієм 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, як я.


0

З іншими відповідями мені не пощастило, я нарешті з’ясував, як це зробити у своїй реалізації, використовуючи вбудовану команду «Видалити» , мабуть, є певний спосіб, який потрібно реалізувати за допомогою макіяжів , це трохи нюанс , ось ось все, що потрібно помістити у свій "CSPROJ" ( TargetDir - це вбудована змінна, включена автоматично) під тегом "Project":

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

У мене також виникли проблеми з генеруванням різних папок для конкретної мови, якщо у вас є і ця проблема, ви також можете видалити невикористані папки, які не використовуються. Я вирішив запустити це лише під типом збірки "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>

-3

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

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

В основному, кожне розширення (відмежене крапкою з двократкою) буде виключено.


1
Це питання та його відповідь прийняті 4 роки, і ваша відповідь є майже копією вставленої відповіді.
— Зак

1
Різне - це синтаксис лише для XML-файлів, який мені потрібен. Мені довелося провести кілька досліджень для правильного синтаксису цього тегу. Я вважав оригінальну відповідь корисною і голосував її, але подумав, що можу врятувати когось іншого деякий час, якщо їм просто потрібно буде фільтрувати певний тип файлу.
— ProVega

11
Але чи не включатиме це файли xml, не виключає їх?
— Девід Гардінер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.