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

118

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

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

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

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

Джейсон Морс
источник

Ответы:

68

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

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
mwjackson
источник
9
Это похоже на правильный путь, потому что вы можете просто включить его в аргументы MSBuild определения сборки, и вам не придется взламывать файлы csproj.
The Muffin Man
2
Это отлично работает с TFS и избавляет от необходимости изменять сотни проектов в моем случае
ste-fu
Также отлично работает со сборками в стиле TFS2018 и без XAML.
knipp
аккуратное и быстрое решение. Спасибо
Каран
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. Однако при сборке через MSBuild у меня не получилось. Мне не нужно указывать его как параметр / p, если он находится в файле проекта.
redcurry
19

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

AndrewJacksonZA
источник
Спасибо. Это работает, если у вас есть статический список сборок, на которые есть ссылки. Однако в нашем случае у нас было более двух дюжин, многие из которых находились в постоянном движении, пока мы проводили рефакторинг.
Джейсон Морс,
4
Лично я думаю, что это правильный ответ - иначе вы взломаете файл проекта, и кто-то еще (или вы сами годы спустя) не будет знать, где искать, чтобы предотвратить это.
Младен Михайлович
1
Я тоже предпочитаю этот способ. Мне нравится позволять тому, что должно произойти (или изначально было задумано), завершиться, а затем позволить событиям пост-сборки сделать это так, как я хочу, в конце. Так кажется намного чище!
Арво Боуэн,
Несмотря на то, что это решение работает, оно не совсем оптимизировано, так как вы теряете время на копирование того, что удаляете. Я также всегда считал шаги до / после сборки хаком, поскольку они не работают в системе сборки так же хорошо, как цели или файлы proj.
christ.s
Вау, @ christ.s, * хихикает * Я надеюсь, что за десять лет, прошедших с тех пор, как я ответил на этот вопрос, команда Visual Studio упростила бы это. :-)
AndrewJacksonZA
5

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

В Visual Studio 2013: в свойствах проекта на вкладке «Компиляция» снимите флажок «Создать файл документации XML», затем нажмите «Расширенные параметры компиляции» ниже и измените «Создать информацию отладки» на «Нет», и это поможет.

Динго
источник
15
Это не повлияет на любые включенные вами пакеты nuget, которые все еще будут иметь pdbи xmlфайлы.
Lankymart
Я использую свойства 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, таким как я.

Джеффри Чжао
источник
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>

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

ProVega
источник
1
Этому вопросу и принятому на него ответу 4 года, и ваш ответ - это почти копипаст принятого ответа.
Зак,
1
Отличается только синтаксис XML-файлов, который мне нужен. Мне пришлось провести небольшое исследование правильного синтаксиса этого тега. Я нашел исходный ответ полезным и проголосовал за него, но решил, что могу сэкономить время кому-то еще, если им просто нужно отфильтровать определенный тип файла.
ProVega
11
Но разве это не будет включать файлы xml, не исключая их?
Дэвид Гардинер