Запобігання посиланням файлів 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.