Предотвращение копирования файлов PDB и XML со ссылками на выходные данные

104

У меня есть проект Visual Studio 2008 С#/.NET 3.5 с задачей post build для ZIP-содержимого. Тем не менее, я обнаружил, что также получаю файлы ссылок .pdb(debug) и .xml(документации) на основе ссылок в моем выходном каталоге (и ZIP).

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

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

Есть ли способ предотвратить копирование проекта связанных файлов PDB и XML?

Теги:
visual-studio
build
pdb-files

7 ответов

60
Лучший ответ

Вы также можете указать это через командную строку:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
  • 9
    Это похоже на путь, потому что вы можете просто включить его в свои аргументы MSBuild определения сборки, и вам не придется взламывать файлы csproj.
  • 2
    Это прекрасно работает с TFS и избавляет от необходимости изменять сотни проектов в моем случае
Показать ещё 2 комментария
133

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

Я вырыл 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>
  • 0
    Интересно. Рад, что проблема была решена.
  • 3
    Это может быть "правильный" способ, но он настолько скрыт, что плохо в моих книгах.
Показать ещё 1 комментарий
16

Вы можете добавить команду события Post Build, похожую на del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

  • 0
    Благодарю. Это работает, если у вас есть статический список ссылочных сборок. В нашем случае, однако, у нас было более двух десятков, причем многие из них постоянно менялись, пока мы проводили рефакторинг.
  • 3
    Лично я думаю, что это правильный ответ - иначе вы взломаете файл проекта, и никто другой (или вы сами спустя годы) не будет знать, где искать, чтобы предотвратить это.
Показать ещё 1 комментарий
5

Это довольно старый вопрос, но поскольку нет ответа о том, как отключить создание файлов PDB и XML через интерфейс, я подумал, что он должен быть здесь для полноты.

В Visual Studio 2013: в свойствах проекта на вкладке компиляции снимите флажок "Сгенерировать файл документации XML", затем нажмите "Дополнительные параметры компиляции" ниже этого и измените "Генерировать информацию об отладке" на "Нет", и это будет делать трюк.

  • 9
    Это не повлияет на любые пакеты nuget, которые вы включаете, они все равно будут иметь файлы pdb и xml .
  • 0
    Я использую свойства OctoPack в моем файле csproj, и это помогло моим PDB и XML-файлам. Я также использовал VS 2015. Build -> Advanced в Output -> установите Debug Info в none в Output.
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, как я.

-1

Зачем вообще создавать файлы .pdb и .xml, если они вам не нужны? Вы можете просто отключить отладку символов и генерацию файла документации в вашем проекте Свойства → Сборка (→ Дополнительно…). (Вероятно, только для сборки Release.)

-3

Если вы хотите только исключить файлы XML (например, отладочную версию), вы можете сделать что-то вроде этого:

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

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

  • 1
    Этому вопросу и принятому ответу 4 года, и ваш ответ является почти копией принятого ответа.
  • 1
    Что отличается, так это синтаксис только для файлов XML, который мне и нужен. Я должен был сделать некоторые исследования для правильного синтаксиса этого тега. Я нашел оригинальный ответ полезным и проголосовал за него, но решил, что смогу сэкономить кому-то еще некоторое время, если ему просто нужно будет отфильтровать файл определенного типа.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню